【发布时间】:2021-05-07 04:42:58
【问题描述】:
我有以下代码:
var arr = [
{ condition: true, recursion: [], result: 'OLD_RESULT', recursiveArray: [{condition: true, result: 'OLD_RESULT'}] },
{condition: false, result: 'OLD_RESULT'},
{ condition: true, recursion: [], result: 'OLD_RESULT', recursiveArray: [{condition: true, result: 'OLD_RESULT'}] },
{condition: false, result: 'OLD_RESULT'},
];
var someAsyncCall = async () => {
return 'NEW VALUE';
};
var asyncInMap = (arr) => {
return arr.map(async (elem) => {
const condition = elem.condition;
if (condition) {
const result = await someAsyncCall();
elem.result = result;
}
if (elem.recursiveArray) {
elem.recursion = asyncInMap(elem.recursiveArray);
}
console.log('SECOND:', elem);
return elem;
});
};
console.log('FIRST');
var promisesVal = asyncInMap(arr);
console.log('THIRD');
var completedVal = await Promise.all(promisesVal);
console.log('FOURTH', completedVal);
我的问题按我收到的console.log's 的顺序排列:
FIRST
SECOND: {condition: false, result: "OLD_RESULT"}
SECOND: {condition: false, result: "OLD_RESULT"}
THIRD
SECOND: {condition: true, recursion: Array(1), result: "NEW VALUE", recursiveArray: Array(1)}
SECOND: {condition: true, recursion: Array(1), result: "NEW VALUE", recursiveArray: Array(1)}
SECOND: {condition: true, result: "NEW VALUE"}
SECOND: {condition: true, result: "NEW VALUE"}
FOURTH (4) [{…}, {…}, {…}, {…}]
为什么在所有Second console.log 完成之前打印Third 日志?这是因为我在asyncInMap 函数中使用递归以及async/await?理想情况下应该完成asyncInMap(首先打印所有Second 日志),然后只打印正确的Third 日志?
【问题讨论】:
-
如果你不勾选“使用 BabelJS”选项,它会在 StackOverflow 中运行。这不是必需的,因为大多数浏览器都支持 ES6,尽管没有任何记录。
-
@Barmar 在 Safari 中,我相信我需要检查一下。但是当你将它粘贴到支持 ES6 的浏览器中时,你是否碰巧知道为什么日志会以这种顺序出现?