Функция уменьшения массива с асинхронным ожиданием - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь пропустить один объект из массива объектов на основе асинхронного оператора.Я пробовал следующие случаи, но получаю ошибку типа.

Пробный метод 1

newObjectArray = await Promise.all(objectAray.reduce(async (result, el) => {
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
      result.push(newSavedFile);
  }
  return result;
}, []));

Пробный метод 2

newObjectArray = await Promise.all(objectAray.reduce(async (prevPromise, el) => {
  const collection = await prevPromise;
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
      prevPromise.push(newSavedFile);
  }

  collection.push(newSavedFile);
  return collection;
}, Promise.resolve([])));

Ошибка

'TypeError: #<Promise> is not iterable',
'    at Function.all (<anonymous>)',

1 Ответ

0 голосов
/ 06 октября 2018

В первой попытке result - это обещание, так как все функции async оцениваются как обещание при вызове, поэтому вам нужно await result, прежде чем вы сможете перейти к массиву, и тогда вам не нужноPromise.all:

 newObjectArray = await objectAray.reduce(async (result, el) => {
  const asyncResult = await someAsyncTask(el);
  if (asyncResult) {
    (await result).push(newSavedFile);
  }
  return result;
}, []);

Но я предполагаю, что проще фильтровать потом:

 newObjectArray = (await Promise.all(objArray.map(someAsyncTask))).filter(el => el);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...