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

about complicated biz logic in async

我是 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 并重新编写函数的 return 代码?

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

一个选项(免责声明:不是很优雅...)是在全局范围内定义变量(因此它们在任何地方都可以访问),然后使用 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);
        }
   });

否则,你可以使用promises,这样可读性会更好。