【问题标题】:$q.all and nested promises$q.all 和嵌套承诺
【发布时间】:2014-10-03 18:07:57
【问题描述】:

有一个关于在 Angular 中使用 $q 时同步嵌套 Promise 的问题。 下面的代码会确保等待整个 Promise 链吗?这意味着对返回承诺的服务的嵌套调用会在 $q.all 块中等待吗?

var call1 = service1.get('/someUr').then(function(){
  return service2.get('/someUrl2'); //returns promise
});

var call2 = service3.get('/someUr').then(function(){
  return 'hello';
});

var call3 = service4.get('/someUr').then(function(){
  return service3.get('/someUrl3');//returns promise
});

$q.all(call1,call2,call3).then(function(){
  console.log('All asynch operations are now completed');
});

基本上:当前代码是否有可能在所有嵌套的 promise 被解析之前执行 $q.all 的 then ?还是递归的?

【问题讨论】:

  • 不,我不这么认为。 $q.all() 将等待call1call2call3 在触发then() 函数之前一起解析,但不会等待从call1call3 返回的嵌套异步调用。
  • 我的印象是它会等待。
  • 我目前没有方便的角度环境来测试它,但有了原生承诺,它肯定会等待。 jsfiddle.net/p4evLjm6
  • @KevinB 看起来你是对的。我在下面创建了一个快速的 Angular 测试。

标签: angularjs q angular-promise


【解决方案1】:

是的,看起来凯文是正确的。我还创建了一个角度快速测试来确认行为。

angular.module('myModule').controller('testController', function ($q,$scope) {

  function promiseCall(data,timeout) {
    var deferred = $q.defer();

    setTimeout(function() {
      deferred.resolve(data);
      console.log(data);
    }, timeout);

    return deferred.promise;
  }

  var a = promiseCall('call1 a',1000).then(function(){
    return promiseCall('call2 a',50);
  });

  var b = promiseCall('call1 b',500);

  var c = promiseCall('call1 c',1000).then(function(){
    return promiseCall('call2 c',50).then(function(){
      return promiseCall('call3 c',6000);
    });
  });

  $q.all([a,b,c]).then(function(res){
    console.log('all calls are done');
  });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 2014-02-02
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多