基于JavaScript系列的控制流

基于JavaScript系列的控制流,javascript,node.js,control-flow,Javascript,Node.js,Control Flow,在Misu的Node.js书中,有一个关于控制流的非常棒的章节。下面的模式允许您串联异步请求,以确保在调用下一个事件之前事件已完成。我想对此进行修改,以便将一个异步请求的响应作为参数传递给下一个异步请求 有什么想法吗 您可以更改下一个函数签名,以便向其传递结果。这是你可以做到的 function series(callbacks, last) { var results = []; function next(result) { var callback = callback

在Misu的Node.js书中,有一个关于控制流的非常棒的章节。下面的模式允许您串联异步请求,以确保在调用下一个事件之前事件已完成。我想对此进行修改,以便将一个异步请求的响应作为参数传递给下一个异步请求

有什么想法吗


您可以更改
下一个
函数签名,以便向其传递
结果
。这是你可以做到的

function series(callbacks, last) {
  var results = [];
  function next(result) {
    var callback = callbacks.shift();
    if(callback) {
      callback(function(result) {
        results.push(Array.prototype.slice.call(arguments));
        next(result);
      }, result);
    } else {
      last(results);
    }
  }
  next();
}
// Example task
function async(arg, callback) {
  var delay = Math.floor(Math.random() * 5 + 1) * 100; // random ms
  console.log('async with \''+arg+'\', return in '+delay+' ms');
  setTimeout(function() { callback(arg * 2); }, delay);
}

function final(results) { console.log('Done', results); }

series([
  function(next) { async(1, next); },
  function(next, result) { console.log('result: ', result); async(2, next); },
  function(next, result) { console.log('result: ', result); async(3, next); },
  function(next, result) { console.log('result: ', result); async(4, next); },
  function(next, result) { console.log('result: ', result); async(5, next); },
  function(next, result) { console.log('result: ', result); async(6, next); }
], final);
编辑:

为了能够传递多个结果,只需将series函数更改为:

function series(callbacks, last) {
  var results = [];
  function next() {
    var callback = callbacks.shift(), args;
    if(callback) {
      callback.apply(this, (args = [
        function() {
          results.push(Array.prototype.slice.call(arguments));
          next.apply(this, arguments);
        }
      ]).concat.apply(args, arguments));
    } else {
      last(results);
    }
  }
  next();
}

您可以研究如何使用promises:或模块,特别是
.瀑布()
function.Best。回答。曾经顺便问一下,有没有办法将多个参数返回回调函数并在下一个函数中读取它们?喂,callback(2,foo)?@4m1r很高兴我能帮忙,我已经更新了答案以处理多个参数。再次感谢@plalx。超级酷的回答。关于您的编辑,我实际上是想找到一种方法,在回调中使用多个参数从异步返回。然而,由于我可以将一个对象文本作为结果传递回去,所以这可能不是一个好的设计。无论如何,您的编辑似乎是一个更优雅的解决方案。在我的系列中,我将结果直接传递给下一个函数,例如async(result,next)。效果很好。你想帮全世界一个忙,帮助我们确切地理解是什么让这项工作起作用?@4m1r当然,但你能更具体地说明你不完全理解的部分,以及你发现的神秘部分吗?我最困惑的是“下一步”函数是如何作为初始参数传递给系列的,或者任何参数的。另外,编译器如何知道它应该关联并运行下一个函数?最后,您将如何在另一个更基本的系列中封装这样的内容,比如说在一个数组片中为每个id处理一个系列?
function series(callbacks, last) {
  var results = [];
  function next() {
    var callback = callbacks.shift(), args;
    if(callback) {
      callback.apply(this, (args = [
        function() {
          results.push(Array.prototype.slice.call(arguments));
          next.apply(this, arguments);
        }
      ]).concat.apply(args, arguments));
    } else {
      last(results);
    }
  }
  next();
}