【发布时间】:2021-04-29 15:21:31
【问题描述】:
我正在使用与 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);
});
}))
}));
【问题讨论】:
-
请不要使用
.map进行简单的迭代。请改用.forEach或实际循环。 -
.forEach不是异步的,我会用promises代替map。 -
重点是不要滥用
.map。它不仅仅是一个迭代数据集的工具。它用于执行映射。 -
是的,我明白了,所以解决方案是使用
.for循环,因为.forEach不是异步的? -
如果您想按顺序处理这些请求或触发所有请求,可以使用常规循环,然后使用
Promise.all一次等待它们。取决于您是要按顺序还是并行处理这些。由于您的请求之间似乎没有依赖关系,Promise.all似乎是更好的选择。这就是链接的副本显示的内容。
标签: javascript typescript asynchronous async-await nestjs