当前位置: 首页 > 知识库问答 >
问题:

使用包含异步等待[duplicate]的数组foreach等待

易炳
2023-03-14

在node.js我需要使用一个函数ProcesMultipleCandiates(),其中包含Array.foreach处理将每个元素插入到db中,但整个函数应该在完成所有插入操作后返回响应

JavaScript代码

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  await data.forEach(async (elem) => {
    try {    
          
           // here candidate data is inserted into  
           let insertResponse = await insertionInCandidate(elem) 
           //and response need to be added into final response array 
           generatedResponse.push(insertResponse)
    } catch (error) {
    console.log('error'+ error);
    }
  })
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}

如上所述,最后一个返回语句不等待foreach执行首先完成。

共有3个答案

储国发
2023-03-14

就我而言,for of在异步时比forEach工作得更好。无论如何,在这种情况下,如果你只关心聚合结果,我认为这可能是一个解决方案。

async function procesMultipleCandidates(data) {
  const promises = data.map(insertionInCandidate);
  return await Promise.all(promises);
}
弘承业
2023-03-14

数组。原型forEach()尝试按顺序执行,您可能并不总能得到预期的结果。

数组。原型map()广泛用于使用数据创建promise,然后使用等待promise进行解析。全部([])

使用. map()函数,所有的promise都是并行解决的,如果你碰巧调用了一个应用编程接口,你可能会得到错误429:太多的请求

要按顺序执行所有promise,可以使用for。。。属于

const array1 = ['a', 'b', 'c'];

for (const element of array1) {
  console.log(element);
}

MDN参考

柯耀
2023-03-14

使用Array.prototype.map和Promise.all:

js prettyprint-override">async function procesMultipleCandidates (data) {
  let generatedResponse = []
  await Promise.all(data.map(async (elem) => {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }))
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}

如果不希望循环同时运行,请使用for/of循环:

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  for(let elem of data) {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}
 类似资料:
  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会实现您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我试图在反应本机中捕捉状态栏的高度。 为此我写了以下代码 在这里,显示为,我打算将其存储在中,但之后的第二个console.log给了我未定义的值 这让我想到是函数。那么,有人能帮我计算一下高度吗?我们如何使用async wait来呈现react native

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 问题内容: 给出以下代码: 产生以下错误: TS2322:类型’Promise []’无法分配给类型’number []’。类型’Promise 不可分配给类型’number’。 我该如何解决?怎样才能让和一起工作? 问题答案: 这里的问题是,您正在尝试兑现承诺而不是承诺。这没有达到您的期望。 当传递给的对象不是Promise时,只需立即按原样返回值,而不是尝试解析它。因此,由于您在此处传递了(P

  • 我正试图将图像上传到firebase存储,但调用该函数时,未执行wait以获取url。我错过了什么? 看看这个其他主题,我发现问题可能是“然后”,但我如何设置代码以等待url? 异步/等待/然后飞镖/颤振 谢谢