Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中链接嵌套的承诺_Javascript_Loops_Nested_Promise - Fatal编程技术网

Javascript 在循环中链接嵌套的承诺

Javascript 在循环中链接嵌套的承诺,javascript,loops,nested,promise,Javascript,Loops,Nested,Promise,我对承诺有点陌生,并且坚持下面的练习 我有一个值数组,我想对每个值执行一个异步调用。 在回调中,我想对第一个调用的结果执行另一个调用 基本上,我的挫折感是: 执行顺序应为“1x2x3x”,但执行顺序为“123xxx” 换句话说,当第一个承诺的子/嵌套承诺尚未完成时,循环已经进入下一个迭代 var values = ["1", "2", "3"]; function do(val) { var deferred = Q.defer(); asyncCall(val) .then(

我对承诺有点陌生,并且坚持下面的练习

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

基本上,我的挫折感是: 执行顺序应为“1x2x3x”,但执行顺序为“123xxx”

换句话说,当第一个承诺的子/嵌套承诺尚未完成时,循环已经进入下一个迭代

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));
}

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

你不需要延迟,这是你的承诺链

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

您可以简单地使用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
}
函数do(val){
var q=q();
对于(变量i=0;i


注意:Bind只是固定函数调用的值。在这种情况下,由于第一个参数(
this
值)为空,它的作用类似于
函数(fn,arg){return function(arg){return fn(arg);}}}
也就是说,它将函数调用转换为“部分应用程序”-有关更多信息,请参阅。

谢谢您的回答。但我不完全明白。我已经删除了延迟模式,并按照如下方式重构了代码:函数检索(值){return asyncCall(值)。然后(函数响应){console.log(响应);return response.asyncCall2();})。然后(函数响应){console.log(响应);});}我可以在第一个“then”中省略返回,但是asyncCall2的承诺不会传递给第二个。@strai您可以在jsfiddle.net上创建一个fiddle来说明这个问题吗?这很难理解