Подтвердить что ты не робот

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 в результаты. Мне это не кажется правильным. Есть ли более чистый способ?

4b9b3361

Ответ 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));
}