Асинхронный JavaScriptAsync/awaitmedium

Ускоряем асинхронный flatten

Пусть нам дан класс AA (Async Array), у которого всего один метод read, возвращающий промис с массивом значений, среди которых могут быть опять экземляры класса AA или числа.

class AA { #array; constructor(...array) { this.#array = array; } read() { return new Promise(resolve => { setTimeout(() => resolve(this.#array), 100); }); } }

Функция flatten принимает экземляр класса AA и возвращает промис с массивом всех чисел, со всех уровней.

Не бойтесь, в этой задаче функцию flatten реализовывать не нужно, она уже написана. Проблема в том, что она работает слишком медленно. Например, для массива example она работает 1000 мс, хотя могла бы работать быстрее.

const example = new AA( new AA(1, new AA(new AA(2)), new AA(3)), new AA(4, new AA(5, 6), 7), 8, new AA(9, new AA(10, new AA(11, 12), 13)), ) async function flatten(value) { const result = []; for (const element of await value.read()) { if (element instanceof AA) { result.push(...await flatten(element)); } else { result.push(element); } } return result; } console.time("aa") flatten(example).then((result) => { console.log(result); // [1,2,3,4,5,6,7,8,9,10,11,12,13] console.timeEnd("aa"); // ≈ 1000 ms });

Перепишите функцию flatten, чтобы она работала быстрее. Для значения example функция может вернуть правильный ответ примерно за 400 мс.