一些代码行让您了解我想问的问题。代码以开头
var webSocketsServerPort = 8002;
var webSocketServer = require('websocket').server;
var conns = [];
每次连接成功后,我都会使用数组连接来推送用户。我在那里放了额外的(他们的ID)信息,这样我就可以识别用户了。
当我需要向用户发送特定信息时,我会调用以下函数。
function sendMessage(userID, message){
for(var i = 0, len = conns.length; i < len; ++i){
if(conns[i].customData.ID == userID){
conns[i].sendUTF(message);
}
}
}
我的问题是:如果用setTimeout(function(){conns[i].sendUTF(message)},1)
替换conns[i].sendUTF(message);
,这样在有5000个连接用户的情况下,sendUTF(msg)
将无法阻止循环,并且在最佳情况下,所有消息都将同时发送,这是一个更好的想法吗。
如果您更改设计以按id而不是按对象数组排序,那么就没有理由必须循环来查找所有用户的连接。您只需要遍历每个用户的多个连接。
var connections = {};
function addConnection (userId, conn) {
if (!connections[userId]) {
connections[userId] = [];
}
connections[userId].push(conn);
}
var getUserConnections (userId) {
return connections[userId];
}
这对你的思维方式没有帮助。如果它当时没有"阻塞",它将在1毫秒内"阻塞"。
以这种方式执行setTimeout
只会延迟执行,而不会延迟排队。JS仍然会阻塞性地运行for
循环,将所有5000个项目放入等待队列,然后再清除堆栈中的其他项目。
您需要的是让位于每次迭代。由于您使用的是NodeJS,因此可以使用process.nextTick()
来安排下一次迭代。下面是一个简单的例子。
var i = 0;
var length = cons.length;
function foo(){
// if not yet the limit, schedule the next
if(i++ < length) process.nextTick(foo);
// Run as usual
if(conns[i].customData.ID == userID) conns[i].sendUTF(message);
}