我是这个承诺世界的新手,我遇到了一个我不知道该怎么办的情况。
我有一个新的承诺被第一个承诺的结果称为。
情况如下:
function asyncCall(object){
return firstObject.loadSomething(object).then(function(result) {
result.innerAsyncCall().then(function() {
finalCode();
});
});
}
我循环遍历asyncCall并构建$ q.all()。然后()等待承诺解析。
然而,由于内在的承诺没有链接,它独立运行
示例代码:
var promises = [];
array.forEach(function(object){
promises.push(asyncCall(object));
});
$q.all(promises).then(function(){
console.log('Done!!');
});
问题是。我该怎么做才能完全执行内部承诺?
答案 0 :(得分:7)
如果您使用承诺解决承诺,它将“递归地”采用其状态并等待最内层的承诺。对于.then()
调用,新承诺将通过回调的返回值解决 - 因此您只需在代码中添加return
即可工作:
function asyncCall(object) {
return firstObject.loadSomething(object).then(function(result) {
return result.innerAsyncCall().then(function() {
// ^^^^^^
finalCode();
});
});
}
请注意,您也可以flatten this into a chain:
function asyncCall(object) {
return firstObject.loadSomething(object).then(function(result) {
return result.innerAsyncCall();
}).then(finalCode);
}