【问题标题】:How to call mongoose findone inside foreach and wait request?如何在 foreach 中调用 mongoose findone 并等待请求?
【发布时间】:2019-08-27 18:47:31
【问题描述】:

我有使用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
          });

        let team2CorrectAnswers = team2AllAnswers
          .filter(el => {
            return el.correct === "true"
          });

        let result = {
          "question": i,
          "team1": {
            "all": team1AllAnswers.length,
            "correct": team1CorrectAnswers.length,
            "percent": team1CorrectAnswers.length * 100 / team1AllAnswers.length
          },
          "team2": {
            "all": team2AllAnswers.length,
            "correct": team2CorrectAnswers.length,
            "percent": team2CorrectAnswers.length * 100 / team2AllAnswers.length
          }
        }

        results.push(result);

      }
      return results;
    })
    .catch(err => {
      console.log("no GameAnswers find err -> ", err);
    });
}

目前我对 mongoDB 的请求仅在 forEach 遍历所有列表之后发生。对于respObj 中的some_type4,我有空对象。我需要从服务器中获得共鸣(即请求停止循环并等待结果,然后再进一步)

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

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

    您可以参考this了解async/await。(重点部分7.2

    希望这会有所帮助:)

    【讨论】:

    • 对不起,没有帮助。我知道我需要如何使用 async/await 或 Promise,但我不知道如何使用它。
    【解决方案2】:

    这是我使用 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);
      }
    })()
    

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2022-12-18
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2016-04-26
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多