【问题标题】:How to handle an async function that depends on multiple other async functions如何处理依赖于多个其他异步函数的异步函数
【发布时间】:2014-07-08 03:40:36
【问题描述】:

我有一个异步函数,它与其他两个异步函数的结果一起工作。

到目前为止,我所做的是在回调函数1中编写function2,在function2的回调中编写function2

function1(callbackFunction() {
    function2(callbackFunction() {
        function3()
    })
})

有没有其他方法可以解决这个问题。我通常在客户端和 nodeJs 中使用 JavaScript 代码。

我的情况是,对于函数 2,我不需要函数 1 的输出。换句话说,function1 和 function2 是独立的;但是function3依赖于function1和function2。

我希望我的函数 2 独立于函数 1 运行,但函数 3 运行同时依赖于函数 1 和函数 2。

有没有类似的

function1();
function2();
when(funtion1.complete && funtion2.complete) {
    function3();
}

【问题讨论】:

  • 你的想法是对的。如果您厌倦了越来越多的嵌套,请查看 npm 中的 async.js 库。您所拥有的是由 async.js github.com/caolan/async#seriestasks-callback中的“系列”助手处理的。
  • @Paul 我对问题做了一些修改,你能不能也考虑一下。
  • 看起来雅各布已经给你写了一个很好的答案......!

标签: javascript node.js asynchronous


【解决方案1】:

有一些很好的库来处理编排异步函数。 asyncq(或其他 Promises/A 库)帮助。

如果function2不依赖function1的结果,可以并行执行。以下是使用async 时的样子(这些示例假定您的回调具有function(err, result) 签名,这是Node 的实际模式:

async.parallel([
    function(callback) { function1(callback); },
    function(callback) { function2(callback); }
], function(err, values) {
    function3(values[0], values[1]);
});

如果function2 依赖于function1 的结果,waterfall 可能是更好的模式:

async.waterfall([
    function(callback) { function1(callback); },
    function(result, callback) { function2(result, callback); },
    function(result, callback) { function3(result, callback); },
]);

就个人而言,我喜欢q,因为你可以传递承诺并做各种漂亮的事情。这是使用它的外观:

q.nfcall(function1)
  .then(function(result) { return q.nfcall(function2); })
  .then(function(result) { return q.nfcall(function3); })
  .fail(function(err) {
      // If any of them fail, this is called.
  });

或者如果function1function2 可以按任意顺序完成:

q.all([q.nfcall(function1), q.nfcall(function2)])
 .then(function(values) { function3(values[0], values[1]); })
 .fail(function(err) {
 });

【讨论】:

  • 将结果传递给函数 2 怎么样?
【解决方案2】:

这是我烘焙的解决方案。您可以尝试调用管理器来调用依赖函数

var func1 = function() {
    console.log("Dependant call ... " + 1);
};
var func2 = function() {
    console.log("Dependant call ... " + 2);
};
var func3 = function() {
    console.log("Dependant call ... " + 3);
};
var func4 = function() {
    console.log("Dependant call ... " + 4);
};


var CallManager = function(funcs_config) {
    var _this = this;

    _this.functions = funcs_config;
    _this.callAsynchronous = function(f) {
        if (f != undefined) {
            for (var i = 0; i < f.length; i++) {
                f[i].call(function() {
                    this.callAsynchronous(f.splice(0,1));
                });
            }
            return;
        }

        for (var func in _this.functions) {
            if (_this.functions[func].length == 0) {
                //not dependent to any function
            } else {
                console.log('Calling....' + func);
                _this.callAsynchronous(_this.functions[func]);
                eval(func +'();');
            }
        }
    };

    return _this;
};


var callManager = new CallManager({
    //dependency configuration
    func2: [func1], //func2 depends on func1
    func3: [func2],
    func4: [func1, func3] //func4 depends on both func1 and func3
});

callManager.callAsynchronous();

使用上面提供的当前配置,运行时输出为 -

Calling....func2
Dependant call ... 1
Dependant call ... 2
Calling....func3
Dependant call ... 2
Dependant call ... 3
Calling....func4
Dependant call ... 1
Dependant call ... 3
Dependant call ... 4

【讨论】:

  • 如果您需要传递参数,只需更改代码以获取您希望的参数,
猜你喜欢
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多