为什么我的$ q.all'然后立刻被调用?

时间:2014-07-17 03:23:08

标签: angularjs promise

我有一个函数可以启动10个“数据读取”并返回一个在所有数据读取完成时被解析的承诺。然而,似乎正在发生的事情是#q.all(...)认为数据读取'承诺在不存在时立即得到解决。

这是一个fiddle。单击按钮3次以启动数据读取。他们应该在5秒后完成。

var app = angular.module("app", []);

function MyCtrl($scope, $timeout, $q) {
    $scope.a = 0;
    $scope.c = "";
    $scope.d = "";

    $scope.click = function click() {
        $scope.a++;
        if ($scope.a == 3) $scope.read();
    };

    $scope.read = function read() {
        $scope.readData()
            .then(function (a) {
                    a.forEach(function(b) {
                        $scope.c += b;
                    });
                    $scope.c += ". done.";
            });
        $scope.c = "Data read started...";
    };

    $scope.readData = function readData() {
        var res = "";
        var ps = [];

        for (var i = 0; i < 10; i++) {
            ps.push($q.defer());
        }

        ps.forEach(function(aq, i) {
            $timeout(
                function () {
                    aq.resolve("(data "+i+")");
                    }, 5000);
        }); 

        var deferred = $q.defer();
        $q.all(ps)
            .then(function(results) {
                deferred.resolve(results);
            });
        return deferred.promise;
    };

    function log(s) {
        $scope.d += "/"+s;
    }
}

1 个答案:

答案 0 :(得分:1)

您没有将承诺推送到ps数组,而是推送整个延迟对象

尝试

ps.push($q.defer().promise);