在循环中链接嵌套的promise

时间:2014-05-20 20:07:22

标签: javascript loops nested promise

我对承诺不熟悉并坚持下面的练习。

我有一个值数组,我想在每个值上执行异步调用。 在回调中,我想对第一次调用的结果执行另一个调用。

基本上,我的挫折感如下: 执行顺序应该是' 1x2x3x'但订单是' 123xxx'

换句话说,当第一个promise的sub / nested promise尚未完成时,循环已经进入下一次迭代..

var values = ["1", "2", "3"];

function do(val) {
  var deferred = Q.defer();


  asyncCall(val)
  .then( function( response ) {
    console.log(val); 
    asyncCall(response)
    .then( function ( response ) {
      console.log('x');
      deferred.resolve(true)
    });
  });

  return deferred.promise;
}

var result = do(values[0]);

values.forEach( function(f) {
  result = result.then(do(f));
}

可能有一个简单的解决方案,但我坚持下去。

1 个答案:

答案 0 :(得分:5)

你不需要延期,那是你承诺连锁以来的deferred anti pattern

此外,如果您希望等待它解决,您必须从.then处理程序返回一个承诺。

你可以简单地使用for循环:

function do(val) {

  var q = Q();
  for(var i = 0; i < val; i++){
    q = q.then(asyncCall.bind(null,i))
         .then(console.log.bind(console))
         .then(console.log.bind(console,"x"));
  }

  return q; // in case you want to chain
}

fiddle

注意:绑定只是固定函数调用的值。在这种情况下,由于第一个参数(this值)为空,它的作用类似于function(fn,arg){ return function(arg){ return fn(arg); }},即它将函数调用转换为&#34;部分应用程序&#34; - 有关详细信息,请参阅 the MDN docs