组合来自多个 async/await 调用的结果

pun*_*ish 2 node.js async-await

我想通过调用许多async/await函数返回合并的结果。考虑下面我的(错误的)伪代码

const getRemoteData = async function(uri) {
    // get result from remote server via XMLHttpRequest
    return result;
}

const finalResult {};
const result1 = getRemoteData('http://…');
result1.forEach(async record => {
    // each record has a key for another URI
    const result2 = await getRemoteData(record["uri"]);

    // result2 has a key for yet another URI
    const result3 = await getRemoteData(result2["uri"]);
    finalResult[ result2["uri"] ] = result3;
})

console.log(finalResult);
Run Code Online (Sandbox Code Playgroud)

当然,既然console.log(finalResult)被称为所有的临时电话forEach回路已经完成了,finalResult是空的。处理完所有条目finalResult 如何返回result1?我使用的是最新版本nodejs,如果可能,我宁愿不使用任何其他Promise库。据我所知,新async/await功能应该使我能够完成我想要的。

Cer*_*nce 5

你需要使用.map,而不是.forEach为了.map每个项目result1Promise解析,一旦相关的result3已分配给finalResult。然后,Promise.all在该数组上使用,它会在所有 Promise 都解决后解决,之后finalResult将填充您需要的所有内容:

const getRemoteData = function(uri) {
  // pretty sure you didn't mean to recursively call getRemoteData:
  return someApiCall(uri);
}
const result1 = await getRemoteData('http://…');
const finalResult = {};
await Promise.all(result1.map(async (record) => {
  const result2 = await getRemoteData(record.uri);
  const result3 = await getRemoteData(result2.uri);
  finalResult[result2.uri] = result3;
}));
console.log(finalResult);
Run Code Online (Sandbox Code Playgroud)

(注意,而不是async功能await的东西,并立即返回它,你可能也只是returnPromise直接代替-也是,点记号通常优选支架符号,括号标记是当你需要使用一个变量属性名)