Что происходит после отправки запроса в JavaScript
Что проверяют
Понимаете ли вы, что отправка запроса ничего не блокирует, и знаете ли, как ответ возвращается в код. Заодно смотрят на обработку ошибок: именно на ней разваливается большинство ответов на этот вопрос.
Как отвечать
fetch возвращает промис сразу, а сам запрос уходит в сетевую часть браузера, которая работает вне основного потока. Функция продолжает выполняться дальше, и только когда придёт ответ, продолжение попадёт в очередь микрозадач и выполнится, как освободится стек вызовов.
Дальше по шагам:
- промис исполняется в момент, когда пришли заголовки, а не всё тело. Поэтому чтение тела это отдельный асинхронный шаг, и
response.json()тоже возвращает промис; - отклонение случается только при сетевой ошибке, отмене или блокировке по политике источников. Коды
404и500это успешный ответ, статус нужно проверять самому черезresponse.ok; - для запроса с нестандартным методом или заголовком браузер сначала шлёт предварительный запрос и ждёт разрешающие заголовки;
- отменяется запрос через
AbortController, им же делается таймаут, своего уfetchнет.
Полезно добавить про гонку: если запросов несколько, ответы приходят в произвольном порядке, и без отмены предыдущего или сверки актуальности в интерфейсе окажется устаревший результат.
Где спотыкаются
Ждут исключения на ошибочном коде ответа. Ветка catch не срабатывает, тело ошибки уходит в разбор как обычные данные, и пользователь видит пустой экран вместо внятного сообщения.
Второе: оборачивают вызов в try/catch, но забывают await или return внутри цепочки. Промис уходит жить сам по себе, ошибка всплывает как необработанное отклонение, а окружающий код считает, что всё прошло успешно.
Третье: не думают о гонке при поиске по мере ввода. Ответ на короткий запрос приходит позже ответа на длинный и перетирает выдачу. Помогает отмена предыдущего запроса или сверка ответа с текущим значением поля.