$q.all 为所有值返回 undefined [英] $q.all returns undefined for all values
问题描述
我正在尝试等待 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(函数(值){deferred.resolve(new Test(values[0], values[1], values[2]));}, 函数(原因){deferred.reject(reason);});返回 deferred.promise;};函数获取(参数){var deferred = $q.defer();$超时(功能(){如果是真的) {deferred.resolve({值:参数});} 别的 {延迟.拒绝({消息:真的很糟糕"});}}, 1000);返回 deferred.promise;}
(在实际代码中 get()
使用 $http
而不是 $timeout
,当然).这是带有代码的 Plnkr,有人可以说明问题所在吗?
你不应该对 get
promise 对象执行 .promise
> 方法,因为你已经返回了 promise
形式的 get
方法.
$q.all([a, b, c])
<块引用>
当你在做 a.promise
时,b.promise
&c.promise
他们都变成未定义
&然后 $q.all
数组变成 $q.all([undefined, undefined, undefined])
将它们传递给 $q.all
将给出未定义
结果.
I'm trying to wait on 3 promises but $q.all
appears to resolve them at once and returns undefined
for each single value, I can't figure out why:
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;
}
(in the actual code get()
uses $http
instead of $timeout
, of course). Here's a Plnkr with the code, can anybody please shed some light on what the issue is?
You should not be doing .promise
on promise
object returned by get
method, because you had already returned promise
form get
method.
$q.all([a, b, c])
When you're doing
a.promise
,b.promise
&c.promise
they all becomesundefined
& then$q.all
array become$q.all([undefined, undefined, undefined])
passing them to$q.all
will giveundefined
result.
这篇关于$q.all 为所有值返回 undefined的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!