объединение результатов нескольких асинхронных / ожидающих вызовов - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу вернуть консолидированные результаты от вызова многих 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 голосов
/ 28 ноября 2018

Вам необходимо использовать .map вместо .forEach для .map каждого элемента в result1 до Promise, который разрешается после назначения 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 что-то и возвращает немедленно, вы можете вместо этого просто return Promise напрямую - кроме того, точечная нотация обычно предпочтительнее скобочной нотации, скобочная нотация - это когда вам нужно использоватьимя свойства переменной)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...