我可以使用异步函数作为node.js中的回调吗?

时间:2018-11-05 13:01:41

标签: javascript node.js express parallel-processing lodash

我可以使用异步函数作为回调吗?像这样:

await sequelize.transaction(async function (t1) {
    _.each(data,  async function (value)  {
        await DoWork(value);
    });
});
//Only after every "DoWork" is done?
doMoreWork();

据我所知,不能保证调用回调的函数将一直等到答应解决后再继续。对?确保将要发生的唯一方法是读取回调传递给的函数的源代码(例如“事务”的源代码)?无论调用函数是如何实现的,是否都存在重写我的示例以使其正常工作的好方法?

1 个答案:

答案 0 :(得分:2)

async函数可以用作回调,但仅当以某种方式使用返回值(保证)来帮助维持正确的控制流时才可以。一个示例是数组map回调。

this problem with forEach的情况相同。问题是transaction使用async回调(一个promise)中的值,但each回调中的值被忽略。

async串联执行承诺的方法是for..of或其他循环语句:

await sequelize.transaction(async function (t1) {
    for (const value of data)
        await DoWork(value);
});

async并行执行承诺的方法是Promise.allmap

await sequelize.transaction(async function (t1) {
    await Promise.all(data.map(async (value) => {
        await DoWork(value);
    }));
});

async函数仅供参考,因为代码无法从中受益。这些可能是返回诺言的常规函数​​。