我试图等待3个承诺,但$q.all
似乎立即解决它们并为每个单独的值返回undefined
,我无法找出原因:
this.doWork = function() {
var deferred = $q.defer();
var a = get('a'),
b = get('b'),
c = get('c');
$q.all([a.promise, b.promise, c.promise])
.then(function(values) {
deferred.resolve(new Test(values[0], values[1], values[2]));
}, function(reason) {
deferred.reject(reason);
});
return deferred.promise;
};
function get(param) {
var deferred = $q.defer();
$timeout(function() {
if (true) {
deferred.resolve({
value: param
});
} else {
deferred.reject({
message: "Really bad"
});
}
}, 1000);
return deferred.promise;
}
(实际代码get()
当然使用$http
代替$timeout
。这里有Plnkr代码,请问有人可以解释一下这个问题是什么吗?
答案 0 :(得分:7)
您不应该对.promise
方法返回的promise
对象执行get
,因为您已经返回了promise
表单get
方法。
$q.all([a, b, c])
当您执行
a.promise
,b.promise
&c.promise
他们都成了undefined
&然后$q.all
数组变为$q.all([undefined, undefined, undefined])
,将它们传递给$q.all
会产生undefined
结果。