为了账号安全,请及时绑定邮箱和手机立即绑定

如何在foreach中调用mongoose findone并等待请求?

如何在foreach中调用mongoose findone并等待请求?

泛舟湖上清波郎朗 2021-09-17 17:21:49
我有我使用的项目列表forEach。我检查每个项目的类型,对于一个项目类型,我需要向 mongoDB 发送请求,然后等待响应以进一步使用它。如果这很重要 - 我使用 forEach 在超时时使用 socket.io 发射。这是我现在如何迭代列表:questionList.forEach((question) => {    let respName = "";    let respObj = question;    if (question.type === "some_type") {      // some not important code      // respName = "some_name"     } else if (question.type === "some_typeN") {      // some not important code      // respName = "some_nameN"    } else if (question.type === "some_type4") {      respName = "some_name4"      respObj = getBlockStats(handle, block);    } else {      // some not important code      // respName = "some_nameX"    }    setTimeout(() => {      io.emit(respName, respObj);    }, offset);    offset += offsetIncrease;});这是我在循环中调用的函数:const getBlockStats = (handle, block) => {  return GameAnswers.findOne({ handle })    .then(gameAnswers => {      let maxQuesstionInBlock = gameAnswers.answers        .reduce((a, b) => {          return (parseInt(a.ownId) > parseInt(b.ownId) ? a : b)        })      let results = [];      for (let i = 1; i <= maxQuesstionInBlock.ownId; i++) {        let team1AllAnswers = gameAnswers.answers          .filter(el => {            return el.blockId === block          })          .filter((el) => {            return el.team === "team1"          })          .filter((el) => {            return parseInt(el.ownId) === i          });        let team1CorrectAnswers = team1AllAnswers          .filter(el => {            return el.correct === "true"          });        let team2AllAnswers = gameAnswers.answers          .filter(el => {            return el.blockId === block          })          .filter((el) => {            return el.team === "team2"          })          .filter((el) => {            return parseInt(el.ownId) === i          });目前,我对 mongoDB 的请求仅在 forEach 遍历所有列表之后发生。因为some_type4在respObj我有空对象。我需要在其中得到服务器的响应(即请求停止循环并等待结果,然后再进一步)
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这是我使用 async/await 解决此问题的方法


const questionAction = async (question) => {

    let respName = "";

    let respObj = question;


    if (question.type === "some_type") {

      // some not important code

      // respName = "some_name" 

    } else if (question.type === "some_typeN") {

      // some not important code

      // respName = "some_nameN"

    } else if (question.type === "some_type4") {

      respName = "some_name4"

      respObj = await getBlockStats(handle, block); 

    } else {

      // some not important code

      // respName = "some_nameX"

    }


    setTimeout(() => {

      io.emit(respName, respObj);

    }, offset);


    offset += offsetIncrease;

};


(async () => {

  for (const question of questionList) {

    await questionAction(question);

  }

})()


查看完整回答
反对 回复 2021-09-17
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

最好的解决方案是使用async/await来处理异步数据库调用和for..of循环来迭代你的数组。您不能使用forEach,因为 async/await 在其中不起作用。

你可以参考这个来了解 async/await。(重点7.2节)

希望这可以帮助 :)


查看完整回答
反对 回复 2021-09-17
  • 2 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信