Node.js 如何处理循环中的承诺?
这就是我想做的Node.js 如何处理循环中的承诺?,node.js,promise,sails.js,q,waterline,Node.js,Promise,Sails.js,Q,Waterline,这就是我想做的 var response = []; Model.find().then(function(results){ for(r in results){ MyService.getAnotherModel(results[r]).then(function(magic){ response.push(magic); }); } }); //when finished res.send(response,
var response = [];
Model.find().then(function(results){
for(r in results){
MyService.getAnotherModel(results[r]).then(function(magic){
response.push(magic);
});
}
});
//when finished
res.send(response, 200);
但是,它只返回[],因为异步内容还没有准备好。我使用的是使用Q promise的sails.js。您知道如何在所有异步调用完成时返回响应吗
(承诺方法)看看jQuery延迟对象:
特别是,.when()
由于水线使用Q,因此您可以使用
全部结算方法。
你可以找到
您不能这样做,必须等待异步函数完成
您可以自己创建一些东西,或者使用中间件,或者使用内置功能,如Florent的回答中所述,但我还是要在这里添加另外两个:
var response = [];
Model.find().then(function(results){
var length = Object.keys(results).length,
i = 0;
for(r in results){
MyService.getAnotherModel(results[r]).then(function(magic){
response.push(magic);
i++;
if (i == length) {
// all done
res.send(response, 200);
}
});
}
});
或者使用异步
var response = [];
Model.find().then(function(results){
var asyncs = [];
for(r in results){
asyncs.push(function(callback) {
MyService.getAnotherModel(results[r]).then(function(magic){
response.push(magic);
callback();
})
});
}
async.series(asyncs, function(err) {
if (!err) {
res.send(response, 200);
}
});
});
其中a位于node.js上下文中。啊,我的错。。快速查看这就是答案下面的“删除”链接的目的::-)
var response = [];
Model.find().then(function(results){
var asyncs = [];
for(r in results){
asyncs.push(function(callback) {
MyService.getAnotherModel(results[r]).then(function(magic){
response.push(magic);
callback();
})
});
}
async.series(asyncs, function(err) {
if (!err) {
res.send(response, 200);
}
});
});