我使用Restangular对服务器进行多次同时调用。 Restangular返回每个动作的promise,每个动作都需要对其特定的返回做一些事情,一旦完成所有3个并且.then
函数已经完成,我需要执行另一个函数。
这是在这种情况下做承诺的正确方法吗?
var a, b, c;
a = service1.getList(...).then(function A(data) { do something; $log.debug('a'); return 'a';});
b = service2.getList(...).then(function B(data) { do something; $log.debug('b'); return 'b';});
c = service3.getList(...).then(function C(data) { do something; $log.debug('c'); return 'c';});
$q.all([a,b,c]).then(function wrapUp(values) { $log.debug(values); do something after functions A, B,and C above have finished;}
我不知道$ q.all()是否会在A,B和C的最后运行,或者它是否可以在最后一个函数前面竞争。 wrapUp()总是会被调用吗?
注意A,B和C是承诺a,b和c完成后调用的函数。
传递给wrapUp的values数组似乎是来自A,B和C的返回值。但是,在我的控制台中,函数A记录10次,然后函数B记录10次,然后函数C和函数wrapUp是记录10次(交替)。
10倍的伐木似乎有些东西被打破.....,恐惧的种族情况似乎有可能......
有人能解释一下这里发生了什么吗?
答案 0 :(得分:7)
这是在这种情况下做承诺的正确方法吗?
是的,是的。
10倍的伐木似乎有些东西被打破.....,恐惧的种族情况似乎有可能......
有人能解释一下这里发生了什么吗?
它实际上没有被打破。就像你建议$q.all
等待所有的承诺一样。
在:
$q.all([a,b,c,d]).then(function(){
// yes, this only runs after all of the promises fulfilled
});
以下是发生的事情:
你有一个运行10次的循环:
$q.all
组成的a,b,c为a(已经解决)b(已经解决),现在c已经完成。$q.all
组成的a,b,c为a(已经解决)b(已经解决),现在c已经完成。等等。
唯一的保证是,在其本地 a,b和c之后, $q.all([a,b,c]
的实例将在循环内完成。没有别的,仅此而已。
如果要挂钩所有返回值的聚合承诺,当然可以对所有返回值执行$q.all
。