$ q.all - 太早解决?

时间:2016-10-25 17:50:43

标签: javascript angularjs

我有一个函数可以进行一些服务器调用:

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()似乎在我的任何承诺解决之前被调用。我在这里做了什么明显的错误吗?

1 个答案:

答案 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
    });
}