【问题标题】:Async/Await not working with mongoose findOneAsync/Await 不适用于猫鼬 findOne
【发布时间】:2021-06-18 19:31:41
【问题描述】:

我正在尝试获取回复变量,但是当调用回调函数时,我得到的只是一个空变量。异步/等待似乎不适用于 findOne 函数,因为我在调用回调后获取值。

function byClanTag(tag, callback) {
  clashApiClient
    .clanByTag(tag)
    .then((response) => {
      var reply = "";
      console.log("1");
      response.memberList.forEach(async (member) => {
        console.log("2");
        await Player.findOne({ playerTAG: member.tag }, (err, player) => {
          if (err) {
            console.log(err);
            callback("Error: ", err);
          }
          if (!player) {
            console.log("3");
            reply = reply + member.name + ": " + "Strike information doesn't exist.\n";
          } else {
            reply = reply + member.name + ": " + player.strikeCount + "Strikes.\n";
          }
        });
      });
      console.log("4");
      callback("```" + response.name + " :   \n\n" + reply + "```");
    })
    .catch(() => callback("Error: Something went wrong while getting data!"));
}

预期的日志输出是 1 (23)*n 乘以 4,但我最终得到 1 (2)*n 乘以 4 (3)*n 次

【问题讨论】:

  • 你应该使用for ...of循环而不是forEach循环来保证promise正常工作

标签: javascript mongoose async-await


【解决方案1】:

您要么使用回调,要么使用 Promises。当您使用await Player.findOne({ ... }, (err, player) => { ...}) 时,您正在尝试同时执行这两种操作。

您应该将该行更新为const player = await Player.findOne({ ... })。另外,正如 Rifat 在评论中所建议的那样,使用 for ...of 循环以使 Promise 正常工作。

【讨论】:

  • 我同意,无论是承诺还是回调,代码看起来都非常混乱。难以阅读和调试
【解决方案2】:

使用 Promise.all 以并行方式而不是串行方式发出所有请求是有意义的:

function byClanTag(tag, callback) {
  clashApiClient
    .clanByTag(tag)
    .then((response) => {
      const pendingPromises = response.memberList.map((member) => Player.findOne({ playerTAG: member.tag })
      return Promise.all(pendingPromises)
    })
    .then((arrayOfResults) => {....})
    .catch(() => callback("Error: Something went wrong while getting data!"));
}

但是,为了减少数据库的负载,正确的解决方案是在一个请求中通过一组 ID 获取数据。

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2018-07-10
    • 1970-01-01
    • 2019-05-30
    • 2021-05-10
    相关资源
    最近更新 更多