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

$q not waiting till the nested $http call completes

我正在使用 $q 并检查所有 $http.get 服务调用是否已完成。在一个 $http 调用中,有一个嵌套的 $http.get 调用(在成功函数中进行)。 $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;
        });
    });

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

如果您想 运行 这些函数异步,则需要将它们添加到 promises 数组中。

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

编辑

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

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