使用嵌套的异步等待函数调用
Using nested async await function calls
我正在尝试调试一个非常简单的代码。我有一个 async
函数:
async function updateResult(event){
let result = db.fetchResult(event.ProcessId);
return result;
}
我从另一个简单的 async
函数调用它:
exports.processEvent = async (event) => {
try {
let promises = [];
const controls = await db.fetchControls(event.EventCode);
if (controls) {
promises = controls.map((control) => {
console.log(control);
control.map(x => this.updateResult(event));
});
}
return Promise.allSettled(promises);
}
catch (err) {
console.error(err);
}
};
问题是在exports.processEvent
中,db.fetchControls(event.EventCode)
的内容被执行到完成(一些逻辑和一个db getItem调用)。
但是通过 this.updateResult(x.Id, x.Version, event)
调用 db.fetchResult(event.ProcessId)
并没有完成 fetchResult 任务的执行(一些其他逻辑 db GET 调用)。
我觉得 fetchResult
returns 过早了。我做错了什么?
.map()
不是 promise-aware。它不会等待回调中的任何承诺完成。所以,在这段代码中:
control.map(x => this.updateResult(x.Id, x.Version, event));
它只是遍历整个数组,忽略返回的所有承诺,因此没有等待这些承诺。
您可以通过将这些 promise 返回到更高级别 .map()
来解决此问题,然后您正在等待 Promise.all()
:
promises = controls.map((control) => {
console.log(control);
return Promise.all(control.map(x => this.updateResult(x.Id, x.Version, event)));
});
我正在尝试调试一个非常简单的代码。我有一个 async
函数:
async function updateResult(event){
let result = db.fetchResult(event.ProcessId);
return result;
}
我从另一个简单的 async
函数调用它:
exports.processEvent = async (event) => {
try {
let promises = [];
const controls = await db.fetchControls(event.EventCode);
if (controls) {
promises = controls.map((control) => {
console.log(control);
control.map(x => this.updateResult(event));
});
}
return Promise.allSettled(promises);
}
catch (err) {
console.error(err);
}
};
问题是在exports.processEvent
中,db.fetchControls(event.EventCode)
的内容被执行到完成(一些逻辑和一个db getItem调用)。
但是通过 this.updateResult(x.Id, x.Version, event)
调用 db.fetchResult(event.ProcessId)
并没有完成 fetchResult 任务的执行(一些其他逻辑 db GET 调用)。
我觉得 fetchResult
returns 过早了。我做错了什么?
.map()
不是 promise-aware。它不会等待回调中的任何承诺完成。所以,在这段代码中:
control.map(x => this.updateResult(x.Id, x.Version, event));
它只是遍历整个数组,忽略返回的所有承诺,因此没有等待这些承诺。
您可以通过将这些 promise 返回到更高级别 .map()
来解决此问题,然后您正在等待 Promise.all()
:
promises = controls.map((control) => {
console.log(control);
return Promise.all(control.map(x => this.updateResult(x.Id, x.Version, event)));
});