Express 循环中无等待,关于替代解决方案的建议

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

我在我的应用程序中使用带有mongoose的Express,并且使用ESLint。我的应用程序中有:

  • 某些类别,由名称、id和某些外部类别的id定义以与之匹配

  • 某些事件,由名称和类别定义

我这样做是为了在从json创建事件时获取类别:

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)
}

谢谢,我真的不喜欢这种方法,因为我认为它会使代码阅读变得更复杂,但从性能上看,这似乎是一个很好的解决方案,我打算换一种类似的方法