Свой Promise
Условие
Реализуй MyPromise с конструктором (executor), then(onFulfilled, onRejected) и цепочкой. Синхронный executor, асинхронные колбэки, поддержка возврата промиса из then.
Что проверяют тесты
разрешается значением
асинхронное разрешение
колбэк всегда асинхронный
цепочка передаёт значение
возврат промиса разворачивается
ошибка ловится catch
состояние не меняется дважды
Как подойти
Задача проверяет, понимаешь ли ты промис как автомат состояний. Четыре обязательных вещи: однократный переход состояния, очередь колбэков на случай ожидания, асинхронность колбэков (queueMicrotask - иначе нарушается контракт и порядок выполнения станет непредсказуемым), и разворачивание thenable для цепочек. Пробрасывание ошибки, когда onRejected не передан, - то, благодаря чему catch в конце цепочки ловит всё.
Подсказки: 4
- Три состояния и переход только один раз - это первый инвариант.
- Колбэки, добавленные до разрешения, копятся в очереди.
- then обязан возвращать новый промис, иначе не будет цепочки.
- Если onFulfilled вернул thenable, его надо дождаться и развернуть.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.