我可以使用异步函数作为回调吗?像这样的事情:
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.all
和map
:
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/