【问题标题】:For loop and map diffFor循环和地图差异
【发布时间】:2021-03-02 21:14:31
【问题描述】:

我有两个案例,我试图了解发生了什么,但对我来说仍然不够清楚,所以我读到如果我想在 for 循环或 map 中运行异步调用,我需要使用 Promise.all 但是让我分享一下发生在我身上的事情

首先我使用地图更新了我数据库中的许多记录,它更新了一些而不是全部数据

AllAuthToken.map(async singleToken =>{
          let deviceIds = uuidv4();
        let newDeviceArray = {
          [deviceIds]: singleToken.deviceToken,
        };
        await AuthToken.updateOne(
          { _id: singleToken._id },
          {
            $set: {
              tokensDeviceArray: [newDeviceArray],
              deviceId: [deviceIds],
            },
          },
          { $new: true }
        );
}

然后发生这种情况后,我使用了 for 循环并更新了所有数据

  for (let i = 0; i < AllAuthToken.length; i++) {
    let deviceIds = uuidv4();
    let newDeviceArray = {
      [deviceIds]: AllAuthToken[i].deviceToken,
    };
    await AuthToken.updateOne(
      { _id: AllAuthToken[i]._id },
      {
        $set: {
          tokensDeviceArray: [newDeviceArray],
          deviceId: [deviceIds],
        },
      },
      { $new: true }
    );
  }

那么发生了什么导致第一个案例失败而第二个案例通过

【问题讨论】:

    标签: javascript arrays mongodb es6-promise


    【解决方案1】:

    原因是.map 一个接一个地执行它的回调,没有等待。 await 做了它的事,但这只会延迟await 之后的代码。但它不会阻止.map 迭代继续下一次调用回调,因为它不是await 发生的async 函数的一部分。

    另一方面,for 循环是 async 函数的一部分,与 await 发生的地方相同,因此只有在等待的承诺解决时迭代才会继续。

    如果您希望以“并行”方式执行数据库请求,即在不等待前一个请求解决的情况下启动下一个请求,则使用Promise.all,如下所示:

    let promises = AllAuthToken.map(singleToken => {
        let deviceIds = uuidv4();
        let newDeviceArray = {
            [deviceIds]: singleToken.deviceToken,
        };
        return AuthToken.updateOne(
            { _id: singleToken._id },
            {
                $set: {
                    tokensDeviceArray: [newDeviceArray],
                    deviceId: [deviceIds],
                },
            },
            { $new: true }
        );
    };
    
    await Promise.all(promises);
    /* ... now all is done ... */
    

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 2010-09-20
      • 2010-11-13
      • 2021-11-18
      • 2020-09-04
      • 1970-01-01
      • 2021-07-18
      • 2010-11-08
      相关资源
      最近更新 更多