Перенос номера в МТС из другого оператора идёт в четыре шага: проверка паспорта, бронь даты переноса, подписание заявления по SMS-коду, отправка заявки в базу переносов. Каждый шаг — запрос к своему сервису, и следующий нельзя начинать, пока не закончился предыдущий.
Напишите sequence(tasks). tasks — массив функций без аргументов, каждая возвращает промис. Функции вызываются по одной: следующая — только после того, как промис предыдущей выполнился.
Результат — промис массива ответов в порядке шагов. Если шаг отказал, sequence отказывает с той же ошибкой, а оставшиеся шаги не вызываются. Пустой массив даёт [].
В работе: Заявление на перенос нельзя подписывать, пока сервис броней не подтвердил дату: из 4 шагов каждый ждёт предыдущий.
Пример 1: четыре шага подряд
[[300, "паспорт ок"], [200, "бронь 25.10"], [100, "подписано"], [400, "заявка 77-0193"]]
{"out": ["ok", ["паспорт ок", "бронь 25.10", "подписано", "заявка 77-0193"]], "started": [[0, 0], [1, 300], [2, 500], [3, 600]], "end": "done"}Пример 2: пустой список
[]
{"out": ["ok", []], "started": [], "end": "done"}sequence — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 6: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function sequence(tasks) // → Promise<Array>
Источник: на задачах МТС: перенос номера в личном кабинете. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.