Как определить момент нахождения лучшего покупателя с учетом отказов и цен
Что проверяют
Прежде всего умение уточнить условие: формулировка расплывчатая, и интервьюер смотрит, зададите ли вы вопросы до кода. Во фронтенд-секции это обычно задача на асинхронность: покупатели отвечают промисами, кто-то называет цену, кто-то отказывает, и нужно понять, когда лучший уже известен. Следом просят добавить таймаут и отмену лишних запросов.
Как отвечать
Уточните: опрашиваем всех параллельно или по одному, есть ли потолок цены, сколько ждать ответа. Затем разберите комбинаторы:
Promise.all: упадёт на первом отказе, не подходит;Promise.any: вернёт первую цену, но не лучшую;Promise.race: вернёт первый исход, в том числе отказ;Promise.allSettled: дождётся всех, дальше фильтр поstatus === "fulfilled"и максимум. Нет ни одной цены, значит покупатель не найден: это отдельный исход, а не исключение.
Лучший известен, когда ответили все, или раньше, если кто-то предложил потолочную цену. Для раннего выхода allSettled не годится, нужен свой промис со счётчиком ожидающих. Каждый ответ обновляет текущий максимум, отказ просто уменьшает счётчик, а resolve вызывается, когда счётчик дошёл до нуля или цена упёрлась в потолок. Оставшиеся запросы отменяет общий AbortController, таймаут на покупателя даёт AbortSignal.timeout(ms).
Если покупатели приходят по очереди и к отказанному не вернуться, это задача об оптимальной остановке. Классическая стратегия: пропустить первые n/e, около 37% предложений, запомнить лучшее из них и взять первое, которое его превзойдёт.
Где спотыкаются
Пишут Promise.all и теряют все цены из-за одного отказа.
Не отменяют оставшиеся запросы после раннего выхода. Результат уже отдан, а сеть и обработчики продолжают работать впустую.
Путают отказ покупателя с ошибкой сети. Отказ это нормальный ответ, его учитывают в подсчёте, а сетевой сбой стоит повторить или явно пометить.