Express 循环中无等待,关于替代解决方案的建议
我在我的应用程序中使用带有mongoose的Express,并且使用ESLint。我的应用程序中有:Express 循环中无等待,关于替代解决方案的建议,express,asynchronous,mongoose,eslint,Express,Asynchronous,Mongoose,Eslint,我在我的应用程序中使用带有mongoose的Express,并且使用ESLint。我的应用程序中有: 某些类别,由名称、id和某些外部类别的id定义以与之匹配 某些事件,由名称和类别定义 我这样做是为了在从json创建事件时获取类别: let promises = []; for (let i = 0; i < events.length; i++) { const event = new Event({ name: events[i].name, cat
- 某些类别,由名称、id和某些外部类别的id定义以与之匹配
- 某些事件,由名称和类别定义
let promises = [];
for (let i = 0; i < events.length; i++) {
const event = new Event({
name: events[i].name,
category: await Category.findOne({externalSource: events[I].category_id})
});
promises.push(event.save());
}
Promise.all(promises)...
let promissions=[];
for(设i=0;i
我的代码正在工作,但ESLint在循环中抛出错误no wait
。我用/*eslint disable no wait in loop*/
停用了它,但我想知道在遵守eslint约束的同时,我必须这样做的好的替代解决方案是什么
我在考虑在mongoose中使用一个预保存钩子来设置类别,如果还没有定义的话,但是我不知道这是否是一个好的做法,我认为它可能会有一些副作用
谢谢
等待
in循环将不允许每个操作并行执行(几乎)。仅当希望在循环中的下一个操作之前完成上一个操作时,才应使用它
也就是说,wait
将在下一个操作之前等待,直到它得到当前请求的响应。然而,您可以并行启动操作或使用计数器变量逐个启动操作,这足以解决您的问题:
let tasks = [];
var counter = 0
for (let i = 0; i < events.length; i++) {
Category.findOne({externalSource: events[i].category_id}).then(d => {
counter++
tasks.push(new Event({
name: events[i].name,
category: d
}).save())
if(counter === events.length){
Promise.all(tasks).then(allData => {
console.log('Done', allData)
}).catch(console.error)
}
}).catch(console.error)
}
let tasks=[];
变量计数器=0
for(设i=0;i{
柜台++
任务。推送(新事件)({
名称:事件[i]。名称,
类别:d
}).save())
if(计数器===事件长度){
Promise.all(任务)。然后(allData=>{
console.log('Done',allData)
}).catch(console.error)
}
}).catch(console.error)
}
谢谢,我真的不喜欢这种方法,因为我认为它会使代码阅读变得更复杂,但从性能上看,这似乎是一个很好的解决方案,我打算换一种类似的方法