使用async/await与for in循环

3
我有一个名为uploadedFiles的对象。当我运行这段代码时,首先运行console.log,然后运行for循环,因此我会得到一个空数组。我该如何解决这个问题?
 let orderFilesData = [];
      for (let key in uploadedFiles) {
        uploadedFiles[key].map(async (file) => {
          let id = file.id;
          const orderFile = await this.orderFileRepository.findOne(id);
          orderFile.order = order;    
          await this.orderFileRepository.save(orderFile);
          orderFilesData.push(orderFile.fileUrl);
        });
      }
console.log(orderFilesData);
4个回答

3

由于您没有从map函数返回任何数据,请尝试使用foreach循环。由于您使用了async函数,在orderFilesData中设置的内容将是一组promises,并且您必须等待它们完成(await)。最简单的解决方案是使用Promise.all这个数组(console.log(Promise.all(orderFilesData))这样做应该可以达到您想要的效果)。


2

当使用async函数和array.map时,它会返回一个未运行的promise列表。您需要使用Promise.all(或其他方法)来启动这个过程。

在您的for循环中尝试以下内容:

 const uploadPromises = uploadedFiles[key].map(async (file) => {
       ...
  });
  await Promise.all(uploadPromises)

1
我猜测问题在于 Array.map 是异步的,因此即使每个对 save 的调用都有 await,在迭代元素和调用 .map 内的匿名函数时也以异步方式完成。
尝试用简单的 for 循环替换 uploadedFiles[key].map,我相信这将解决问题。

0

uploadedFiles 似乎是一个对象,其中键的值是数组?因此,如果您调用 uploadedFiles[key].map(...),则会创建一个承诺数组,其中每个承诺似乎都在等待。但是,由于 map 的回调是异步的,因此实际上您并没有等待。最简单的方法是使用 Promise.all() 来等待 map 生成的承诺数组中的所有承诺。

  let orderFilesData = [];
  for (let key in uploadedFiles) {
    await Promise.all(uploadedFiles[key].map(async (file) => {
      let id = file.id;
      const orderFile = await this.orderFileRepository.findOne(id);
      orderFile.order = order;    
      await this.orderFileRepository.save(orderFile);
      orderFilesData.push(orderFile.fileUrl);
    }));
  }
 console.log(orderFilesData);

但是为了使其正常工作,请确保周围的函数是async


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接