Node.js 在map中使用多个wait

Node.js 在map中使用多个wait,node.js,promise,async-await,Node.js,Promise,Async Await,我对下面的代码有点困惑 let bookingID result = await Promise.all(result.map(async (item) => { bookingID = item.id; console.log('###############################'); AData = await book.fetchA(bookingID); console.log(bookingID); BD

我对下面的代码有点困惑

 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是相同的,总是最后一个)

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

###############################
2918849262429175807
==============================
###############################
2918849262429175808
==============================
但是如果我将console.log的顺序更改为

      console.log('###############################');
      console.log(bookingID);
      AData = await book.fetchA(bookingID);
      BData = await book.fetchB(bookingID);
      console.log('==============================');
输出为(注意,id不同)

我完全糊涂了。8-(

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

即使Node.js是单线程的
Promise.all
也不会阻止
Promise
等待结果,所以当第一个Promise等待
时,AData=wait book.fetchA(bookingID);
另一个Promise继续调用
console.log
并再次等待,因此最终结果是正确的

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

对于第二种情况,也可以使用类似的参数。调用
Promise时,只保留返回值的顺序。即使Node.js是单线程
Promise,所有的
都不会阻止
Promise
等待结果,所以当第一个Promise等待
AData=wait book.fetchA(bookingID)时
另一个承诺继续调用
控制台。记录
并再次等待,以确定最终结果

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

对于第二种情况,也可以使用类似的参数。调用
Promise.all

时只保留返回值的顺序。但是为什么当console.log(bookingID)位于AData=wait book.fetchA(bookingID)之后时,它总是获得相同的id?它至少应该获得不同的id。因为循环引用了第一种情况下全局声明的
let bookingID
,所以在等待
wait book.fetchA(bookingID)之后;
它的值在两个承诺中都变为
2918849262429175808
。仍然不清楚,抱歉。在第一个循环中,bookingID=item.id;bookID为1。然后等待book.fetchA(bookingID),对吗?然后,bookID的值“1”至少应该发送到下一个等待book.fetchB(bookingID)。但是等待book.fetchB(bookingID);始终获取最后一个bookID 2.我找到了!谢谢Gaurav Dhiman!是的,bookingID在全局声明,不应该是这样。它应该在循环中声明。但是为什么console.log(bookingID)在AData=wait book.fetchA(bookingID)之后总是获取相同的id?它至少应该获得不同的id。因为循环引用了第一种情况下全局声明的
let bookingID
,所以在等待
wait book.fetchA(bookingID)之后;
它的值在两个承诺中都变为
2918849262429175808
。仍然不清楚,抱歉。在第一个循环中,bookingID=item.id;bookID为1。然后等待book.fetchA(bookingID),对吗?然后,bookID的值“1”至少应该发送到下一个等待book.fetchB(bookingID)。但是等待book.fetchB(bookingID);始终获取最后一个bookID 2。我找到了!谢谢Gaurav Dhiman!是的,bookingID是全局声明的,不应该是这样。它应该在循环中声明。
###############################
###############################
2918849262429175808
2918849262429175808
==============================
==============================