Первый упавший сервер
Условие
Массив серверов; начиная с какого-то все сбоят. Проверка асинхронная: check(name) возвращает Promise<boolean> - true, если сервер жив. Одновременно проверять можно только один сервер. Верни промис с адресом первого упавшего. Число вызовов проверки - минимально возможное. async/await и генераторы использовать нельзя.
Что проверяют тесты
находит первый упавший
минимум проверок
проверки не идут параллельно
все живы
первый же упал
Как подойти
Бинарный поиск по асинхронному предикату. Запрет на async/await превращает цикл в рекурсивную функцию-шаг, вызываемую из then - так гарантируется, что следующая проверка стартует только после ответа предыдущей. Логарифм проверок вместо линейного перебора и есть требование «минимально возможное количество». Ошибку проверки надо пробрасывать в reject, иначе промис зависнет.
Подсказки: 3
- Свойство монотонно: слева живые, справа упавшие - значит бинарный поиск левой границы.
- Без async/await рекурсия строится на then, вызывающем следующий шаг.
- Последовательность обеспечивается тем, что следующий шаг делается внутри then.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.