关于异步中复杂的业务逻辑

时间:2019-12-10 08:18:16

标签: node.js async.js

我是node.js的新手,并且对异步有一些困惑的问题。请参见下面的代码。

var async = require('async');

const func = function func(cb) {
        cb(null, 'hello');
}
const func1 = function func1(param1, cb) {
        console.log(param1);
        cb(null, 'hello', 'world');
}
const func2 = function func2(param1, param2, cb) {
        console.log(param1, ' ', param2);
        cb(null, 'result');
}
async.waterfall([func, func1, func2], (err, result)=> {
        console.log(result);
});

是的,我们知道该函数将一一运行。我的问题是,是否有一些基于函数结果不同的复杂条件逻辑。这是否意味着我必须使用await并重新编写函数的返回码?

async function doIt() {
    const t= await func(parms);
    ... biz logic ...
    const t1= await func1(t);
    ... biz logic ...
    const t2= await func2(t1);
    ... biz logic ...    
}
doIt();

1 个答案:

答案 0 :(得分:0)

一种选择(免责声明:不是很优雅...)是在全局范围内定义变量(以便可以在任何地方访问它们),然后使用async.series执行所需的任何顺序任务或复杂逻辑执行:

    var async = require('async');

    var param1;
    ...
    var result;


    async.series([
        function(cb) {
            func(function() { 
                 param1 = ...;
                 cb(null);
            }
        },
        function(cb)
            // biz logic
        },
        function(cb) {
             func1(param1, function() {
                 cb();
             }
        },
        // etc.
    ], function(err) {
        if (err) {
            console.error(err);
        } else {
            console.log(result);
        }
   });

否则,您可以使用promise,它将更加易读。