$ q.All没有等到所有的承诺完成时,然后级联

时间:2016-11-02 14:41:35

标签: javascript angularjs asynchronous

我一直在使用$ q.all来异步运行一个promise数组。在数组的一个元素中,我想级联promise,以便在跳转到outest then函数之前完成整个函数。代码如下所示:

$q.all([
        function1().then(function () { }, function (reason) { addToErrorList($scope, reason) }),
        function2().then(function () { }, function (reason) { addToErrorList($scope, reason) }),
        function3().then(function () { }, function (reason) { addToErrorList($scope, reason) }),
        function4().then(function () { }, function (reason) { addToErrorList($scope, reason) }),
        function5($q).then(
            function() {
                $q.all([
                    function51($q).then(function () { }, function (reason) { addToErrorList($scope, reason) }),
                    function52($q).then(function () { 
                        someLogic();
                    }, function (reason) { addToErrorList($scope, reason); }),
                ])})
    ]).then(function () {
        usSpinnerService.stop('spinner');

        if ($scope.errorList.length > 0) {
            showMessages($scope, $scope.errorList, "error");
        }
    });

似乎代码执行“usSpinnerService.stop('spinner');”在它实际运行到function51和function52之前。我想知道有没有让外部$ q.all执行所有功能?感谢。

我还发现每个前四个函数中的addToErrorList($ scope,reason)都是异步运行的。有没有让它同步运行然后执行outest然后函数?

更正:以上段落不正确。我检查了addToErrorList,然后在外部然后执行函数之前运行。

1 个答案:

答案 0 :(得分:2)

您需要在此处返回$q.all

function() {
    return $q.all([
        function51($q).then(function () { }, function (reason) { addToErrorList($scope, reason) }),
        function52($q).then(function () {
            someLogic($http, $scope, $q, sharedService);
        }, function (reason) { addToErrorList($scope, reason); }),
    ])})