$ q不等待嵌套的$ http调用完成

时间:2015-07-21 17:17:57

标签: angularjs http q angular-promise

我正在使用$ q并检查是否所有$ http.get服务调用都已完成。在一个$ http调用中,有一个嵌套的$ http.get调用(在success函数中进行)。 $ q.allSettled不会等到嵌套的$ http调用完成。如何处理这种情况?

var promises = [];
var promise = $http.get(url1).success(function(data){
        $http.get(url2).success(function(data){
            console.log("success2");
        }).error(function(data){console.log("failue2")});
     })).error(function(data){
         console.log("failure1")
     });
promises.push(promise);

$q.allSettled(promises).then(function(data){
     console.log("log3");
});

我使用的是改进版本$ q。这是代码

angular.module("qImproved", [])
    .config(function($provide) {
        $provide.decorator("$q", function($delegate) {
            function allSettled(promises) {
                var deferred = $delegate.defer(),
                    counter = 0,
                    results = angular.isArray(promises) ? [] : {};

                angular.forEach(promises, function(promise, key) {
                    counter++;
                    $delegate.when(promise).then(function(value) {
                        if (results.hasOwnProperty(key)) {
                            return;
                        }
                        results[key] = {
                            status: "fulfilled",
                            value: value
                        };
                        if (!(--counter)) {
                            deferred.resolve(results);
                        }
                    }, function(reason) {
                        if (results.hasOwnProperty(key)) {
                            return;
                        }
                        results[key] = {
                            status: "rejected",
                            reason: reason
                        };
                        if (!(--counter)) {
                            deferred.resolve(results);
                        }
                    });
                });

                if (counter === 0) {
                    deferred.resolve(results);
                }

                return deferred.promise;
            }
            $delegate.allSettled = allSettled;
            return $delegate;
        });
    });

1 个答案:

答案 0 :(得分:1)

你的promises数组(虽然它被命名为复数)只包含一个promise。

如果要异步运行这些函数,则需要添加promises数组。

或者如果你想同步运行它们,那么不要只是$ q。只需将您的回调代码放在最后then/success

修改

您可以使用$q.defer()来创建新的承诺 将此承诺添加到promises数组中,并仅在最终的嵌套回调中解析它。

然后你将解决承诺链何时竞争,而不仅仅是第一个承诺。