我有一个函数可以启动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;
}
}
答案 0 :(得分:1)
您没有将承诺推送到ps
数组,而是推送整个延迟对象
尝试
ps.push($q.defer().promise);