在循环中链接嵌套的promise

str*_*rai 7 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));
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*aum 5

你不需要延迟,这是你承诺连锁以来你所拥有的延迟反模式.

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

你可以简单地使用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
}
Run Code Online (Sandbox Code Playgroud)

小提琴.

注意:绑定只是固定函数调用的值.在这种情况下,由于第一个参数(this值)为空,它的行为就像function(fn,arg){ return function(arg){ return fn(arg); }}是,它将函数调用转换为"部分应用程序" - 有关详细信息,请参阅MDN文档.