循环嵌套嵌套的诺言

条纹

我对诺言很陌生,并且坚持进行以下练习。

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

基本上,我的沮丧之处在于:执行顺序应为“ 1x2x3x”,但顺序应为“ 123xxx”

换句话说,当第一个promise的子/嵌套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));
}

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

本杰明·格伦鲍姆(Benjamin Gruenbaum)

您不需要递延,这就是自promises链以来您所拥有递延反模式

另外,.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
}

摆弄

注意:绑定只是固定函数调用的值。在这种情况下,由于第一个参数(this值)为null,因此它的行为是function(fn,arg){ return function(arg){ return fn(arg); }}这样,它将一个函数调用转换为“部分应用程序”-有关更多信息,请参见MDN文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章