【问题标题】:Wait for map to end before continuing等待地图结束后再继续
【发布时间】:2020-06-29 23:25:13
【问题描述】:
  let shouldHavePaid = 0;

  demographicsArray.map((country) => {
    if (country.checked == true) {
      Price.findOne({ country: country._id }).then((priceRes) => {
        if (priceRes) {
          shouldHavePaid = shouldHavePaid + priceRes.priceSMS * country.count;
        } else {
          shouldHavePaid = shouldHavePaid + 0.1 * country.count; //Default price for unlisted countries
        }
      });
    }
  });

  console.log(`Finish: ${shouldHavePaid}`);

我希望最后的 console.log 在地图之后执行,但它会在地图完成之前触发。 我期待这个输出,因为据我所知地图应该是同步的而不是异步的。我相信对数据库的请求搞砸了?你会在这里建议什么?

【问题讨论】:

  • 1.请不要使用.map 进行简单的迭代。为此使用循环或.forEach。 2. .map 一个同步操作,但是你在里面启动异步操作。您要么需要使所有异步并使用Promise.all 并等待所有完成(并行),要么转换为常规循环和await 每次迭代(顺序)。您也可以 reduce 进行单个顺序操作,但我可能会使用循环。
  • 谢谢,为什么不建议使用 map 进行简单的迭代?对于使用等待的能力?
  • It's the wrong tool 这是误导性的。映射操作是 1:1 转换。将它用于其他任何事情都会向将来查看代码的任何人发送错误信息,包括您自己.map 是 JavaScript 和许多其他语言中的一个成语。对于常见的数组操作,还有许多其他更好的习惯用法。检查我的个人资料信息。

标签: javascript node.js asynchronous async-await


【解决方案1】:

您可以将Promise.all 与await 结合使用:

await Promise.all(demographicsArray.map(async (...)=>{
    if (...) {
        await Prize... 
        if (priceRes) {
            ....
        }
    }
})

console.log(...)

Await 可以在 async 函数中使用,仅在 Promise 完成后运行下一行。 Promise.all() 允许您等待一系列承诺。将回调标记为async 使其返回一个承诺,Promise.all() 可以使用该承诺。它还允许您在函数内部使用 await,因此您不必使用 .then()

【讨论】:

    【解决方案2】:

    嗯,你自己说的差不多

    我期待这个输出,因为据我所知地图应该是同步的 而且不是异步的。我相信对数据库的请求搞砸了?

    你的Price.findOne(expr)返回一个promise,所以这部分是异步的,所以这是你问题的根源。

    为了让您的 console.log 出现在最后,并且无需对您的代码进行重组,只需将其放在实际记录(如果已获取并比较数据)之后!

     let shouldHavePaid = 0;
    
      demographicsArray.map((country) => {
        if (country.checked == true) {
          Price.findOne({ country: country._id }).then((priceRes) => {
            if (priceRes) {
              shouldHavePaid = shouldHavePaid + priceRes.priceSMS * country.count;
            } else {
              shouldHavePaid = shouldHavePaid + 0.1 * country.count; //Default price for unlisted countries
            }
      console.log(`Finish: ${shouldHavePaid}`);
          });
        }
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2019-11-01
      • 2021-05-06
      • 2021-05-21
      相关资源
      最近更新 更多