首页 > 解决方案 > 在地图中使用多个等待

问题描述

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

 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.jspromiseasync-await

解决方案


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

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

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


推荐阅读