我想更新客户端与套接字断开连接的时间。但是,下面的代码从“find({where:{room_id:roomId}})”行给出了“没有方法'indexOf'”。有谁知道为什么?谢谢!
var roomId;
roomId = socket.on('updateStartTime', function(roomId) {
//some code
return roomId
});
socket.on('disconnect', function() {
var date = new Date();
Room.find({
where: {
room_id: roomId
}
}).complete(function(err, room) {
if (err) console.log(err);
room.updateAttributes({
end_time: date
}).success(function(room) {
console.log("end_time: " + room.end_time);
});
});
socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...');
});
同时,当从客户端从socket.emit触发事件时,它会起作用。
roomId = socket.on('updateStartTime', function(roomId) {
var date = new Date();
Room.find({
where: {
room_id: roomId
}
}).complete(function(err, room) {
if (err) console.log(err);
room.updateAttributes({
start_time: date
}).success(function(st) {})
return roomId;
});
});
答案 0 :(得分:1)
基本上事件驱动的模型是当某些事件发生时你遇到某个闭包(如果你不知道什么是闭包或它是如何工作的,看看this thread)。所以你的代码:
roomId = socket.on('updateStartTime', function (roomId) {
// this is where the closure starts
return roomId;
// closure ends here
}
好像你正试图从关闭的外面获得roomId。但这不会奏效。代码中的错误是:
虽然你期望将它分配给全球roomId,但“返回roomId”无处可去。想一想,在事件驱动模型中,您永远不知道何时执行此函数(roomId)。因此,当你将socket.on结果分配给全局roomId时,如果它还没有执行,它怎么能给你roomId呢?并且它不会阻止等待结果,因为nodejs的非阻塞模型。实际上,如果你查看socket.on的文档,它会立即返回,这是一个'socket'。这就是你得到错误的原因。
你的代码的第二个和平是有效的,因为它在封闭内部。 roomId指的是当地roomId,它是一个预期值。这段代码仍然没有给你想要的,因为当有人断开连接时它没有被执行。这是你可以尝试的东西:
socket.on('updateStartTime', function (roomId) {
socket.on('disconnect', function() {
// your 'Room' operation here.
socket.broadcast.emit('updateChat', 'SERVER', socket.username + ' has disconnected...');
});
});
请记住,在事件驱动的模型中,它不是按顺序执行的。任何事都可以随时发生。你需要在正确的地方做正确的事。