Помогите решить задачу на JS про map, class, Promise

Создайте класс AsyncArray . Экземрляры AsyncArray должны обладать всеми возможностями обычного Array. Дополнительно экземпляры AsyncArray должны иметь следующие методы:

serialMap - По сути работает как обычный map, только преобразование элемента массива происходит асинхронно (т.е. функция преобразования для каждого элемента возвращает Promise). Следовательно, и сам метод serialMap тоже возвращает Promise. Следующий элемент массива обрабатывается только после предыдущего.

Пример использования:

import { AsyncArray } from './index.js';

const array = new AsyncArray(1, 2, 3, 4, 5);

array
  .serialMap((el, index, arr) => {
    // преобрвзовываем элемент массива с помощью функции, которая возвращает Promise
    return asyncAction(el);
  })
  .then(newArray => {
    // newArray - массив с результатами всех преобразований
  });
parallelMap - Аналог метода serialMap, только элементы массива могут обрабатываться параллельно.

Пример использования:

import { AsyncArray } from './index.js';

const array = new AsyncArray(1, 2, 3, 4, 5);

    введите сюда код

array
  .parallelMap((el, index, arr) => {
    // преобрвзовываем элемент массива с помощью функции, которая возвращает Promise
    return asyncAction(el);
  })
  .then(newArray => {
    // newArray - массив с результатами всех преобразований
  });

Ответы (1 шт):

Автор решения: Трипольский Пётр

StackOverflow - сообщество для технических вопросов

Если вы не будете собирать свои решения хотя бы по кусочкам чужого кода, вам будет сложно стать программистом

class AsyncArray extends Array {
  constructor(...args) {
    super(...args)
  }
  serialMap = async (fn) => {
    let result = [];
    for (const item of this) {
      result.push(await fn(item))
    }
    return result;
  }
  parallelMap = async (fn) => {
    return await Promise.all(this.map(async (item) => await fn(item)))
  }
}

const array = new AsyncArray(1, 2, 3, 4, 5);

array.serialMap((el) => el + 1).then(console.log) // [2, 3, 4, 5, 6]

array.parallelMap((el) => el + 1).then(console.log) // [2, 3, 4, 5, 6]
→ Ссылка