【问题标题】:Using multiple await in map在地图中使用多个等待
【发布时间】:2020-01-07 14:53:48
【问题描述】:

我对下面的代码有点困惑。

 let bookingID
 result = await Promise.all(result.map(async (item) => {
      bookingID = item.id;
      console.log('###############################');
      AData = await book.fetchA(bookingID);
      console.log(bookingID);
      BData = await book.fetchB(bookingID);
      console.log('==============================');

      return {
        'AData ': AData ,
        'BData ': BData ,
        'id': bookingID
      };
  }));

我在控制台中得到的是:(注意。id 是相同的。始终是最后一个)

###############################
###############################
2918849262429175808
2918849262429175808
==============================
==============================

循环逻辑似乎有问题,输出应该是

###############################
2918849262429175807
==============================
###############################
2918849262429175808
==============================

但是如果我把console.log的顺序改成

      console.log('###############################');
      console.log(bookingID);
      AData = await book.fetchA(bookingID);
      BData = await book.fetchB(bookingID);
      console.log('==============================');

输出是(注意,id 不同)

###############################
2918849262429175807
###############################
2918849262429175808
==============================
==============================

我完全糊涂了。 8-(

只要找一件有趣的事。当我使用 console.log(item.id) 而不是 console.log(bookingID) 时,它可以获得正确的 id 结果。 “bookingID = item.id”是怎么回事?为什么 console.log(bookingID) 在 AData = await book.fetchA(bookingID) 之后总是得到相同的 id?

【问题讨论】:

    标签: node.js promise async-await


    【解决方案1】:

    即使 Node.js 是单线程的,Promise.all 也不会阻塞,如果其中一个 Promise 等待结果,所以当第一个承诺等待 AData = await book.fetchA(bookingID); 时,另一个承诺继续调用 console.log 并再次等待,所以最终结果是

    ###############################
    ###############################
    2918849262429175808
    2918849262429175808
    ==============================
    ==============================
    

    可以为第二种情况提出类似的论点。调用Promise.all时只保留返回值的顺序

    【讨论】:

    • 但是为什么 console.log(bookingID) 在 AData = await book.fetchA(bookingID) 之后总是得到相同的 id?它至少应该得到不同的 id。
    • 因为循环在第一种情况下从全局声明的let bookingID 引用,所以在等待await book.fetchA(bookingID); 之后,它的值在两个promise 中都变为2918849262429175808
    • 还是不清楚,抱歉。在第一个循环中,bookingID = item.id;例如 bookID 为 1。然后等待 book.fetchA(bookingID),对吗?然后,bookID 的值 '1' 应该被发送到下一个 await, book.fetchB(bookingID);至少。但是等待 book.fetchB(bookingID);总是得到最后一个 bookID 2。
    • 我明白了!谢谢高拉夫·迪曼!是的,全局声明的bookingID,不应该是这样的。它应该在循环中声明。
    猜你喜欢
    • 2020-10-31
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2022-06-15
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多