javascript - 我可以在 Node.js 中使用异步函数作为回调吗?

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

据我了解,不能保证调用回调的函数会等到 Promise 解决后再继续。正确的?确定会发生什么的唯一方法是读取回调传递到的函数的源代码(例如“交易”的源代码)?有没有一种好方法可以重写我的示例,使其无论调用函数如何实现都可以正常工作?

最佳答案

async 函数可以作为回调,但前提是返回值( promise )以某种有助于维持正确控制流的方式使用。一个例子是数组 map 回调。

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

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

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

async并行执行promise的秘诀是Promise.allmap:

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

async 函数仅供引用,因为代码不会从中受益;这些可以是返回 Promise 的常规函数​​。

关于javascript - 我可以在 Node.js 中使用异步函数作为回调吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154982/

相关文章:

javascript - 通过标签名称获取元素的子元素长度

Node.js 快速应用程序缓存/页面加载缓慢(swig 模板引擎)

javascript - 在 Express 中使用 Parse.Cloud.httpRequest 时出现问题,表示没有这样的成功方法 :

JavaScript 正则表达式匹配无效数字

javascript - d3.js 图表不考虑边距

javascript - 在 Javascript onclick 中删除行

node.js - 在 Node.js/Waterline 中指定返回字段?

mysql - 如何根据另一个模型数据验证字段

javascript - 使用连接表单上传文件

javascript - 类型 'Query' 的对象不可 JSON 序列化