我正在使用与 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);
});
}))
}));
答案 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);