gpt4 book ai didi

javascript - 同步等待处理请求

转载 作者:太空宇宙 更新时间:2023-11-04 01:42:06 25 4
gpt4 key购买 nike

所以这个问题已经困扰我很长一段时间了。基本上我有一个投币游戏系统设置,其中用户创建一个大厅供其他用户加入,当一个用户加入时,他们 throw 一枚硬币,获胜者获得两个用户的积分。

如果一段时间内没有人加入,大厅创建者可以取消大厅并取回积分。这就是问题出现的地方。如果创建者请求取消大厅 2 次或更多次,并且两次请求之间的时间间隔很短,则在第一个请求完全完成并且更新数据库之前,任何其他取消请求也会执行,因为大厅的状态仍然是“可用”。一旦第一个请求完成并且数据库得到更新(大厅状态设置为“已取消”),其他取消请求就会失败。因此,如果成功,大厅创建者可以获得 2 次或更多次积分。

当 2 个用户同时加入大厅时也会出现此问题,因为我的处理方式非常类似。

我怎样才能使第一个请求完全运行并等待数据库更新,然后再处理其他请求。

客户端

$('#cancelLobby').click( () =>{   
socket.emit('cancelLobby', lobby-id);
});

服务器

socket.on('cancelLobby', (id) => {
if(id){
Coinflip.findById({_id: id}).lean().exec( (err, res) => {
if (err) throw err;

if(res == null || res.status == "Completed" || res.status == "Canceled"){
socket.emit('serverMessage', {
type: 'error',
title: 'Error',
message: 'This lobby doesn\'t exist or has already ended'
});
return;
}

if(res.creator_name != socket.request.user.name){
socket.emit('serverMessage', {
type: 'error',
title: 'Error',
message: 'Error occured while canceling the lobby'
});
}else {
Coinflip.findOneAndUpdate({_id: id}, {$set: {status: 'Canceled'}}, (err) =>{
if (err) throw err;

socket.emit('serverMessage', {
type: 'success',
title: 'Success',
message: 'Lobby canceled successfully, you will get your points back shortly.'
});
});
}
})
}else{
socket.emit('serverMessage', {
type: 'error',
title: 'Error',
message: 'Error occured while canceling the lobby'
});
}
});

最佳答案

您只能处理该事件一次(在客户端和服务器上):

$('#cancelLobby').one('click', () => {   
socket.emit('cancelLobby', lobby-id);
});

socket.once('cancelLobby', (id) => {
...
});

关于javascript - 同步等待处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com