[英]Promises inside loop to wait
我有以下代码:
var services = ['EC2', 'S3', 'RDS', 'IAM']
var promises = [];
for(var i = 0; i < services.length; i++) {
var promise = awsStatus('us-east-1', services[i])
promises.push(promise);
console.log(promises);
}
q.all(promises).then(function(data){
console.log(promises);
});
它应该使用awsStatus
方法在services
数组上循环。 问题是有时我会得到所有想要的结果:
{ service: 'IAM', status: 0 }
{ service: 'EC2', status: 0 }
{ service: 'RDS', status: 0 }
但是有时我得到的结果不完整。 我认为我需要.then
以后awsStatus
但也没有解决这个问题。 在这段代码中还有什么问题?
从现在开始有评论,我也尝试过这个:
var services = ['EC2', 'S3', 'RDS', 'IAM']
var promises = [];
for(var i = 0; i < services.length; i++) {
var promise = awsStatus('us-east-1', services[i]).then(function(promise){
promises.push(promise);
//console.log(promises);
});
}
q.all(promises).then(function(data){
console.log(promises);
});
并产生相同的结果。
尝试使用.each
Promise.each(services, function(service) {
return awsStatus('us-east-1', service).then(function(promise){
promises.push(promise);
//console.log(promises);
});
}).then(function() {
console.log('Done with all instances');
});
我可以建议使用异步库的解决方案,如下所示:
var services = ['EC2', 'S3', 'RDS', 'IAM']
async.map(services,
function(item, done){
awsStatus('us-east-1', item).then(
function(){
done(null, "Completed item " + item);
},
function(err){
done(err + " in item " + item, null);
}
);
},
function(err, results){
if(err) return console.log(err);
console.log(results);
}
);
如果承诺之一返回错误,它将失败并停止执行。 如果不想停止,则可以在promise的错误函数中返回null
,而不是将错误消息作为done
方法的第一个参数
您的代码中有两个问题:
q.all()
不能保证代码将等待所有的诺言得以解决。 如果其中之一被拒绝,则将调用then
方法,而不等待其他承诺。 您可以改用q.allResolved()
解决此问题。 如何解决这两个问题的示例:
q.allResolved(promises).then(function(results) {
console.log(results);
}).catch(function(err) {
console.error(err);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.