Выбор ответа Middle Асинхронные паттерны обновлено
Таймаут через Promise.race
Вопрос
Запрос обёрнут в Promise.race([fetch(url), timeout(3000)]), где timeout отклоняется через 3 секунды. Сервер отвечает за 10 секунд. Что происходит с самим запросом после таймаута?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Он идёт до ответа сервера, результат просто игнорируется. Promise.race лишь выбирает, чей результат вернуть.
Варианты ответа
- Он идёт до ответа сервера, результат просто игнорируетсяправильный ответ
- Он автоматически прерывается, сокет закрывается
- Node бросает исключение внутри fetch и рвёт запрос
- Соединение закрывается сборщиком мусора сразу
Разбор
Promise.race лишь выбирает, чей результат вернуть. Проигравшие промисы не отменяются, сокет и память заняты до конца запроса. Чтобы прервать реально, нужно fetch(url, { signal: AbortSignal.timeout(3000) }).
- Автоматической отмены у промисов нет.
- Race не влияет на другие промисы.
- GC не трогает активные соединения.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Executor промиса выполняется сразу
Следующий вопрос
return промиса без await внутри try