Angular $ q.all()console.log输出顺序时间对我没有意义

时间:2015-06-07 08:42:04

标签: angularjs q

我有这项服务

angular.module("myApp").service("xhrService", [
    "$q", function($q) {
        var promises = [];

        return {
            push: function(promise) {
                promises.push(promise);
            },
            process: function($scope) {
                $q.all(promises).then(function() {
                    $scope.$emit("loading:dataReady");
                    promises = [];                     
                });
            }
        }
}]);

父控制器中的此代码

$scope.$on("loading:dataReady", function () {
    console.log("Data Ready");
});

子控制器中的此代码

var getEstimatedExpenseTypes = $http.get("api/estimatedExpenseType").then(
    function (response) {
        console.log("getEstimatedExpenseTypes Success");
        $scope.estimatedExpenseTypes = response.data;
    },
    function(response) {
        console.log(response.data);
    }
);


xhrService.push([getEstimatedExpenseTypes]);

xhrService.process($scope);

我遇到的问题是console.log没有按照我期望的顺序发生。在chrome中,使用此代码,我首先看到“Data Ready”,然后“getEstimatedExpenseTypes Success”。不应该是相反的方式吗?

我认为$ q.all()。then(...)代码会在all()中的承诺之后运行。但是根据控制台写入的顺序来判断,情况似乎并非如此

这里发生了什么。我不能正确理解这是如何工作的

更新: 已修复$on代码放置

1 个答案:

答案 0 :(得分:1)

$q.all期待一系列承诺,提到的代码使其成为承诺的array of array

xhrService.push([getEstimatedExpenseTypes]);将数组[getEstimatedExpenseTypes]推入数组var promises = [];

xhrService.push([getEstimatedExpenseTypes]);替换xhrService.push(getEstimatedExpenseTypes);会使执行顺序正确。

working fiddle

修改

如果你想从控制器推送一系列承诺,你可以改变服务中的推送方法,

push: function(promise) {
    Array.prototype.push.apply(promises, promise);
}

然后你可以写一些类似

的东西
xhrService.push([getEstimatedExpenseTypes]);

修改

如果你想为你的服务添加单一和承诺数组,那么这样的事情应该可行

push: function(promise) {
    if(Object.prototype.toString.call(promise) == "[object Object]")
        promises.push(promise);
    else if if(Object.prototype.toString.call(promise) == "[object Array]")
        Array.prototype.push.apply(promises, promise);
}

希望这会有所帮助。