ES7 Получение результата из массива promises с использованием генератора ожиданий
Учитывая массив promises, какой идиоматический способ получить результаты в ES7?
Вот что я хочу сделать:
async function getImports() {
let imports = [System.import('./package1.js'), System.import('./package2.js')];
let promises = await* imports;
let results = [];
await promises.forEach(val => val.then(data => results.push(data))); //seems hacky
console.log(results); // array of 2 resolved imports
}
Результат верен, но я все еще делаю forEach
и then
, чтобы преобразовать разрешенные promises в результаты. Мне это не кажется правильным. Есть ли более чистый способ?
Ответы
Ответ 1
Как уже упоминалось в проблеме, которую вы подали, основная проблема заключается в том, что await*
больше не является вещью и была удалена. К сожалению, в Babel 6 не было правильной синтаксической ошибки, и, по сути, он воспринимался как обычный await
.
Вам нужно явно
let [p1, p2] = await Promise.all([
System.import('./package1.js'), System.import('./package2.js')]);
Ответ 2
Я не могу поверить, что это действительно работает, forEach
возвращает undefined
, который вы не можете await
. Если вам нужен цикл, используйте map
, чтобы получить массив (обещанных) результатов.
В вашем случае вы, похоже, ищете простой
async function getImports() {
let promises = [System.import('./package1.js'), System.import('./package2.js')];
let results = await Promise.all(promises)
console.log(results);
}
Ответ 3
Один из способов сделать это это....
async function abc() {
let p1 = getReviews();
let p2 = getMenu();
let [reviews, menu] = await results(p1, p2);
}
function results(...rest) {
return Promise.all(rest).catch(err => console.log(err));
}