打字稿地图不等待结果

时间:2021-01-25 19:30:50

标签: javascript typescript asynchronous async-await nestjs

我正在使用与 TypeOrm 的多对多关系,后者需要 Id 来查找文章的子类别。

问题在于地图没有等待将结果推送到数组中。

这是我的带有列表和日志的地图函数:

const subcategories = articleDto.subcategoriesIds.split(',').map(x => +x)
const subcategoriesList = []
    
await subcategories.map(async (subcategoryId) => {
    console.log('start:' + subcategoryId)
    const category = await this.subcategoriesService.getSubcategoryById(subcategoryId);
    console.log('mid:' + subcategoryId)
    await subcategoriesList.push(category);
    console.log('end:' + subcategoryId)
});

console.log('### ' + subcategories);
console.log('### ' + subcategoriesList);

这是日志的输出:

start:2
start:3
### 2,3
### 
mid:2
end:2
mid:3
end:3

我不明白为什么不等待结果,如果您知道如何处理这个问题,感谢您的帮助。

编辑:通过在内部使用地图添加 Promise.all 解决了这个问题

const subcategories = articleDto.subcategoriesIds.split(',').map(x => +x);

const subcategoriesList = await Promise.all(subcategories.map((subcategoryId) => {
      return new Promise((resolve => {
        this.subcategoriesService.getSubcategoryById(subcategoryId).then(result => {
          resolve(result);
        });
      }))
    }));

1 个答案:

答案 0 :(得分:0)

数组原型方法即使是异步的也不会等待。代码仍然以同步方式触发。如果你需要这些等待你可以做

const subcategories = articleDto.subcategoriesIds.split(',').map(x => +x)
const subcategoriesList = []

for (const subCategoryId of subcategories) {
  console.log('start:' + subcategoryId)
  const category = await this.subcategoriesService.getSubcategoryById(subcategoryId);
  console.log('mid:' + subcategoryId)
  await subcategoriesList.push(category);
  console.log('end:' + subcategoryId);
}

console.log('### ' + subcategories);
console.log('### ' + subcategoriesList);