Асинхронный JavaScriptРекурсивные структурыmedium

Find all javascript files

Существующий класс Folder имитирует работу директории файловой системы, которая работает асинхронно.

Вам нужно вернуть массив из файлов с расширением .js. Файлы в ответе могут идти в любом порядке.

Интерфейс Folder

Так как файловая система работает асинхронно, методы класса Folder в качестве последнего аргумента принимают колбек, который срабатывает, когда метод отработал.

// root.size ничего не возвращает, // но принимает колбэк в качестве аргумента root.size((s) => { console.log(s); // s === 5 }); // т.к. размер root равен 5, // валидными индексами являются числа от 0 до 4 root.read(4, (x) => { console.log(x); // x === "8.html" });

Если вы знаете TypeScript, то вот так выглядел бы интерфейс, описывающий Folder:

interface Folder { size(cb: (len: number) => void): void; read(index: number, cb: (file: Folder | string) => void): void; }

Пример создания экземляра Folder

root ├── 1.js ├── 2.js ├── foo │ ├── bar │ │ └── 3.txt │ └── 4.js ├── baz │ ├── 5.png │ ├── 6.js │ └── moo │ └── 7.txt └── 8.html
const root = Folder([ "1.js", "2.js", Folder([ Folder([ "3.txt", ]), "4.js", ]), Folder([ "5.png", "6.js", Folder([ "7.txt", ]), ]), "8.html", ]); findAllJavascriptFiles(root, arr => { console.log(arr); // arr === ["1.js", "2.js", "4.js", "6.js"] })

Пример реализации Folder

Для того чтобы решить задачу, вам не нужно знать, как устроен класс Folder. Достаточно знать, как работают его методы.

Для локального тестирования вы можете написать свою реализацию или воспользоваться этой:

function Folder(files) { const rand = () => Math.random() * 500; return { read: (index, cb) => void setTimeout(cb, rand(), files[index]), size: (cb) => void setTimeout(cb, rand(), files.length), }; }

Эта задача не на промисы. Предполагается, что вы решите задачу без использования промисов.