我如何等待JavaScript中的异步事件?
-
20-12-2019 - |
题
我是javascript的新手,仍然不熟悉异步函数...
我正在使用node.js来创建聊天服务器,这是我的代码的一部分,它是收听生成的getListConnected
事件以及它触发它在给定命名空间中查找所有连接的生成的clients
,然后为每个客户端i将他的“用户名”存储到另一个数组,将其转换为JSON响应,然后发送:
socket.on('getListConnected', function(msg){
var clients = namespace.clients();//get all client in that nsp
var usernames = Array() ;//init array
for(i in clients)//for each clients
{
clients[i].get("username", function(value){
usernames.push(value);
});
}
socket.emit('getListConnected',JSON.stringify(usernames));//send
});
.
此代码的问题是client.get()方法是异步巫区意味着用户名将发送为空。
如何等待用户名,直到它填充,或者我如何等待循环,直到它完成?
解决方案
您可以使用中间件进行承诺,类似于 蓝鸟 或者您可以保留一个反击检查所有用户名是否已被收到,如
socket.on('getListConnected', function (msg) {
var clients = namespace.clients();
var usernames = [];
var counter1 = 0;
var counter2 = 0;
for (i in clients) {
counter1++; // number of clients
clients[i].get("username", function (value) {
usernames.push(value);
counter2++; // number of clients added to array
if (counter1 === counter2) {
socket.emit('getListConnected', JSON.stringify(usernames));
}
});
}
});
. 其他提示
这是一个蓝鸟示例,为您的情况定制: [它来自 Victor Quinn示例]
使用Victor使用的相同的承诺定义:
var Promise = require('bluebird');
var promiseWhile = function(condition, action) {
var resolver = Promise.defer();
var loop = function() {
if (!condition()) return resolver.resolve();
return Promise.cast(action())
.then(loop)
.catch(resolver.reject);
};
process.nextTick(loop);
return resolver.promise;
};
.
使用自定义呼叫实例化:
var i = 0;
promiseWhile(function() {
return i < clients.length;
}, function(value) {
return new Promise(function(resolve, reject) {
clients[i].get("username", function(value){
usernames.push(value);
});
i++;
resolve();
});
}).then(function() {
console.log("usernames are: " + usernames);
});
. 不隶属于 StackOverflow