使用嵌套的异步等待函数调用

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)));
  });