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
==============================
==============================