这就是我想做的事情
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。任何想法如何在所有异步调用完成后返回响应?
https://github.com/balderdashy/waterline#query-methods(承诺方法)
答案 0 :(得分:6)
由于水线使用 Q ,您可以使用allSettled
方法
您可以找到more details on Q documentation。
Model.find().then(function(results) {
var promises = [];
for (r in results){
promises.push(MyService.getAnotherModel(results[r]));
}
// Wait until all promises resolve
Q.allSettled(promises).then(function(result) {
// Send the response
res.send(result, 200);
});
});
答案 1 :(得分:3)
你根本做不到,你必须等待异步函数完成。
你可以自己创建一些东西,或者使用async中间件,或使用内置功能,如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);
}
});
}
});
或使用async
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);
}
});
});
答案 2 :(得分:-3)
看看jQuery延迟对象:
http://api.jquery.com/category/deferred-object/
具体来说,.when()
http://api.jquery.com/jQuery.when/