作为一个群体等待多个承诺并且单独处于角度?

时间:2014-03-28 06:27:36

标签: angularjs promise restangular

我使用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倍的伐木似乎有些东西被打破.....,恐惧的种族情况似乎有可能......

有人能解释一下这里发生了什么吗?

Chrome Dev Console

1 个答案:

答案 0 :(得分:7)

  

这是在这种情况下做承诺的正确方法吗?

是的,是的。

  

10倍的伐木似乎有些东西被打破.....,恐惧的种族情况似乎有可能......

     

有人能解释一下这里发生了什么吗?

它实际上没有被打破。就像你建议$q.all等待所有的承诺一样。

在:

 $q.all([a,b,c,d]).then(function(){
     // yes, this only runs after all of the promises fulfilled
 });

以下是发生的事情:

你有一个运行10次的循环:

  • 来自整个循环的来电都会立即完成。
  • 来自整个循环的B调用都立即完成。
  • C电话结算
    • 承诺由$q.all组成的a,b,c为a(已经解决)b(已经解决),现在c已经完成。
  • 接下来c调用结算
    • 承诺由$q.all组成的a,b,c为a(已经解决)b(已经解决),现在c已经完成。

等等。

唯一的保证是,在其本地 a,b和c之后, $q.all([a,b,c]的实例将在循环内完成。没有别的,仅此而已。

如果要挂钩所有返回值的聚合承诺,当然可以对所有返回值执行$q.all