我有一个函数可以进行一些服务器调用:
function doCalls(options) {
var deferred = $q.defer;
myService.doCallOne(options).then(function(response){
myService.doCallTwo().then(function() {
deferred.resolve();
});
});
return deferred.promise;
}
我有一系列不同的选项,我想创建一个承诺数组传递给$q.all
,所以我这样做:
var promiseArray = [];
_.each(optionArray, function(options) {
promiseArray.push(doCalls(options));
});
然后我试着等他们来解决:
$q.all(promiseArray).then(function() {
doNextPart();
});
问题是,doNextPart()
似乎在我的任何承诺解决之前被调用。我在这里做了什么明显的错误吗?
答案 0 :(得分:3)
您忘记调用 $q.defer
,因此它实际上并未创建延迟。您的doCalls
函数调用已返回undefined
,您的deferred.resolve()
个调用引发了异常(被承诺吞没),并且$q.all
立即履行了undefined
数组第
您可以将代码更改为
var deferred = $q.defer();
// ^^
但实际上你应该避免使用deferred antipattern!只需使用
function doCalls(options) {
return myService.doCallOne(options).then(function(response){
return myService.doCallTwo();
}).then(function(secondResponse) {
return undefined; // you might want to omit this
});
}