我可以使用异步函数作为回调吗?像这样:
await sequelize.transaction(async function (t1) {
_.each(data, async function (value) {
await DoWork(value);
});
});
//Only after every "DoWork" is done?
doMoreWork();
据我所知,不能保证调用回调的函数将一直等到答应解决后再继续。对?确保将要发生的唯一方法是读取回调传递给的函数的源代码(例如“事务”的源代码)?无论调用函数是如何实现的,是否都存在重写我的示例以使其正常工作的好方法?
答案 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.all
与map
:
await sequelize.transaction(async function (t1) {
await Promise.all(data.map(async (value) => {
await DoWork(value);
}));
});
async
函数仅供参考,因为代码无法从中受益。这些可能是返回诺言的常规函数。