我正在尝试将一堆异步调用并行排队。但是,我排队的承诺有额外的数据,我希望与承诺值保持一致。
我的问题是:如何传递一个包含promise的对象或数组,并将promises解析为对象中的值?
例如,让我们生成一个正常的承诺数组:
async function asyncFunction(input) {
return input * 10;
}
async function main() {
var promises = [];
for (let i = 0; i < 10; i++) {
promises.push(asyncFunction(i));
}
var result = await Promise.all(promises);
document.getElementById('output').innerText = JSON.stringify(result);
}
main();
<div id='output'></div>
这很好用。但是现在如果我们尝试将promise放入一个对象中,并使用一些元数据:
async function asyncFunction(input) {
return input * 10;
}
async function main() {
var promises = [];
for (let i = 0; i < 10; i++) {
promises.push({
id: i,
value: asyncFunction(i)
});
}
var result = await Promise.all(promises);
document.getElementById('output').innerText = JSON.stringify(result);
}
main();
<div id='output'></div>
value
中的值是一个承诺,而不是已解决的值。
我的预期输出是:
[{"id":0,"value":0},{"id":1,"value":10},{"id":2,"value":20},...]
答案 0 :(得分:1)
您可以推送解析为所需格式的承诺:
async function asyncFunction(input) {
return input * 10;
}
async function main() {
let promises = [];
for (let i = 0; i < 10; i++) {
promises.push(
asyncFunction(i).then(value => ({
id: i,
value,
}))
);
}
let result = await Promise.all(promises);
console.log(result);
}
main();
&#13;
答案 1 :(得分:1)
您可以映射承诺数组并等待包含解析承诺的值键
async function asyncFunction(input) {
return input * 10;
}
async function main() {
var promises = [];
for (let i = 0; i < 10; i++) {
promises.push({
id: i,
value: asyncFunction(i)
});
}
var result = await Promise.all(promises.map(async (promise) => ({
id: promise.id,
value: await promise.value
})));
document.getElementById('output').innerText = JSON.stringify(result);
}
main();