合并来自多个异步/等待调用的结果

时间:2018-11-28 08:07:24

标签: 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);

当然,由于console.log(finalResult)forEach循环中的所有临时调用已经完成之前被调用,因此finalResult为空。在finalResult中的所有条目都已处理后,如何返回result1 ?我正在使用nodejs的最新版本,并且如果可能的话,宁愿不使用任何其他Promise库。据我了解,新的async/await功能应使我能够完成自己想要的事情。

1 个答案:

答案 0 :(得分:3)

您需要使用.map而不是.forEach才能将.map中的每个项目result1转换为Promise,以便一旦关联的{{1 }}已分配给result3。然后,在该数组上使用finalResult,该数组将在其所有承诺均已解决后立即解决,然后在Promise.all中填充您需要的所有内容:

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); async来代替await并立即返回它,点表示法通常比方括号表示法更可取,方括号表示法是当您需要使用变量属性名称时使用的方法)