Промис возвращаемый
fetch()
не ждет завершения всего запроса, он резолвится когда получены все заголовки.
На этом месте их можно обработать и решить что делать дальше, например читать json, текст или бинарные данные из тела, или вообще не обрабатывать тело и прервать запрос.
Так же можно читать тело ответа в виде потока, как уже указал в своем ответе
Надим Закиров
Второй промис из
response.text()
и
response.json()
нужен чтоб дождаться считывания всего тела ответа, притом
response.json()
еще и позволяет браузеру парсить json из ответа потоково прямо во время скачивания, опять же не блокируя поток js/ui.