我正在使用socket-io在nodejs上准备聊天应用程序 问题是并发回调,解释如下: 我保留在相关用户的数据库socketId中, 在socket-io的disconnect事件中,我根据mongodb的socket.id找到用户,并执行一些db操作,从订阅者套接字列表中删除socket.id并更新同一列中的列表(mongodb中的数组)。 现在的问题是何时有并发请求。
所有回调都找到了socketId 然后所有的回调都创建了自己排除的socketids列表(事件是断开连接),然后所有更新都返回到db。
这个approch中的问题是,即使结果是空白列,我最终会使用socketIds,但只删除了一个。
希望能够解释。谁能告诉我这里我做错了什么?这似乎是一个非常普遍的问题,解决它的标准方法是什么。??
代码snippit:
if(sSocketIds.length > 1){
console.log("{disconnect} session contains multiple socket processing for removing the current one");
var nSubscriberSocketids = [];
for(var cnt=0 ;sSocketIds.length>cnt ; cnt++){
if(sSocketIds[cnt]!=socket.id){
nSubscriberSocketids.push(sSocketIds[cnt]);
}
}
// This below line is problem I always end up with n-1 socketIds due to concurrency.
__db.SessionFrame.update({"_id":session._id },{"subscriberSocketIds":nSubscriberSocketids}, function(err,count){
if(err){
console.error("{disonnect} error while removing socket: "+socket.id);
}else{
console.log("{disconnect} subscriber socket removed successfully: socketId: "+socket.id+" session will still persist");
}
});
}