【发布时间】:2018-12-28 11:10:13
【问题描述】:
我正在尝试处理由对象组成的数组。每个对象都有一个字段,其值是一个数字数组。我想以异步/等待方式处理所有数字数组的所有组件。
数据示例如下:
const data = [{
numbers: [1, 2, 3],
}, {
numbers: [4, 5, 6],
}, {
numbers: [7, 8, 9],
}];
我已经通过两种方式实现了这个功能。第一个代码是这样的:
const processData1 = async(data) => {
return Promise.all(data.map(async(d) => {
const partial = await Promise.all(d.numbers.map(async(n) => {
console.log('INIT', n);
const number = await processNumber(n);
console.log('END', n);
return number;
}));
return partial;
}));
};
第二个是这样的:
const processData2 = async(data) => {
for (const d of data) {
for (let n of d.numbers) {
console.log('INIT', n);
n = await processNumber(n);
console.log('END', n);
}
}
};
我希望在控制台中打印的所有情况下都以正确的顺序依次显示“INIT”和“END”。这在第二个代码函数中是正确的。但在第一个中,我看到与数字一样多的 INIT,然后是所有相应的 END:
**** processData1 ****
INIT 1
INIT 2
INIT 3
INIT 4
INIT 5
INIT 6
INIT 7
INIT 8
INIT 9
END 1
END 2
END 3
END 4
END 5
END 6
END 7
END 8
END 9
**** processData2 ****
INIT 1
END 1
INIT 2
END 2
INIT 3
END 3
INIT 4
END 4
INIT 5
END 5
INIT 6
END 6
INIT 7
END 7
INIT 8
END 8
INIT 9
END 9
这怎么可能?为什么await processNumber 等待所有号码都被解析?
【问题讨论】:
-
d.numbers.map(async(n)...将在循环中创建异步函数,这些函数将同时执行,因为在每个结束之前 INIT 一个接一个地出现
标签: javascript node.js promise async-await