NodeJS - 序列中的异步函数

时间:2017-03-14 15:48:49

标签: node.js asynchronous sequential

我有两个(或更多)异步函数 - 比如f1(param,callback)f2(param,callback)我想按顺序运行,即我先执行f1,然后在完成后,我执行{ {1}}(结果为f2)。这可以继续,f1之后执行f3。一个用例是f3进行一些处理,f1可以显示结果或进一步处理。我想知道什么是“最干净”的方法来实现它。我在考虑asyn.seq,但这真的是一个很好的方法吗?任何示例代码?

这是我想到的代码:

f2

1 个答案:

答案 0 :(得分:1)

注意:这是编辑前问题的原始答案。请参阅以下更新。

将一个异步函数的结果传递给第二个异步函数的最简单方法是使用async.waterfall。参见:

它完全针对您描述的用例创建 - 将一个异步函数的resuts放入第二个(可能更多)。

示例:

async.waterfall([
    (cb) => f1(argForF1, cb),
    f2,
], (err, result) => {
    // result is the result of f2
});

这里需要(cb) => f1(argForF1, cb),因为async.waterfall函数不会使用任何参数调用第一个函数,因此您必须创建一个与f1类似但具有参数的函数已提供。

如果你说出这个功能,也许它更清洁:

let f1a = (cb) => f1(argForF1, cb);
async.waterfall([f1a, f2], (err, result) => {
    // result is the result of f2
});

async模块中有更多有用的功能,尤其是async.seriesasync.parallelasync.mapasync.parallelLimitasync.mapLimit等。请参阅文档:

更新

最初在您的问题中,您询问将一个异步函数的结果传递给第二个异步函数的最优雅方法是什么。为此,我建议async.waterfall。现在你编辑了这个问题,看起来在运行第二个函数之前你可能不需要等待一个函数的结果。如果是这种情况,请参阅下面的更新。

使用新示例编辑问题之后,我认为还有一个选项可以实现您所需要的 - 如果这些函数可以并行运行:

而不是:

function f1(obj,callback){
  obj["f1"]="item added by f1";
  callback(null,obj);
}

function f2(obj,callback){
  obj["f2"]="item added by f2";
  callback(null,obj);
}

function f3(obj,callback){
  obj["f3"]="item added by f3";
  callback(null,obj);
}

您可以将这些功能更改为更简单的功能:

function f1(callback) {
  callback(null, "item added by f1");
}

function f2(callback) {
  callback(null, "item added by f2");
}

function f3(callback) {
  callback(null, "item added by f3");
}

并使用async.parallel运行它们,如下所示:

async.parallel({f1, f2, f3}, (err, result) => {
    // your result is an object 
});

并将结果作为对象:

{
  f1: "item added by f1",
  f2: "item added by f2",
  f3: "item added by f3",
}

请注意,只有当函数不需要前一个函数的结果时才有可能 - 这是您(新添加的)示例中的情况,其中您需要前一个结果的唯一原因function是为了让共享对象添加一个新属性。