Nodejs 等到异步映射函数完成执行

Posted

技术标签:

【中文标题】Nodejs 等到异步映射函数完成执行【英文标题】:Nodejs wait until async map function finishes executing 【发布时间】:2021-02-13 17:36:21 【问题描述】:

我有一个数组映射,我需要在完成映射后执行一些代码。

这里是数组映射代码

    studentList.map( async index => 
      try
        const student = await User.findOne(indexNumber: index)
        if (student == null) 
          emptyStudents.push(index)
        
      

      catch(err)
        console.log(err)
      
    )

我该怎么做?由于这是异步的,我无法找到解决方案。

【问题讨论】:

【参考方案1】:
await Promise.all(studentList.map( async index => 
  try
    const student = await User.findOne(indexNumber: index)
    if (student == null) 
      emptyStudents.push(index)
    
  
))

【讨论】:

这是正确的,但稍微解释一下会很好,尤其是因为 Promise 一开始很难理解。【参考方案2】:

您可以尝试使用Promise 包装您的数组映射(并在async 函数中运行它):

await new Promise((resolve, reject) => 
  studentList.map( async index => 
    try
      const student = await User.findOne(indexNumber: index)
      if (student == null) 
        emptyStudents.push(index)
      
      if (studentList.length - 1 === index) 
        resolve();
      
    

    catch(err) 
      console.log(err);
      reject(err);
    
  )
);

// YOUR CODE HERE

【讨论】:

【参考方案3】:

您可以使用地图返回承诺,然后当它们完成时,您可以在地图之外推送到您的数组 -

const studentPromises = studentList.map( async index => 
    return User.findOne(indexNumber: index)
)

const studentResults = await Promise.all(studentPromises)

studentResults.forEach((student) => 
    if (student == null) 
        emptyStudents.push(index)
    
)

【讨论】:

以上是关于Nodejs 等到异步映射函数完成执行的主要内容,如果未能解决你的问题,请参考以下文章

在映射下一项之前,异步等待映射不等待异步函数在映射函数内部完成

Node.js 等到异步函数完成,然后继续执行其余代码

Node.js 等到异步函数完成,然后继续执行其余代码

单线程机器上的异步方法

如何在 javascript 中同步异步映射函数

等到带有异步网络请求的 swift for 循环完成执行