Для чего так было сделано?
Все сделано логично и правильно.
fetch() возвращает
ответ как только все заголовки были прочитаны (не дожидаясь при этом получения полезной нагрузки). Если же надо получить и полезную нагрузку, то в
ответе есть
стрим, из которого уже читаете что Вам нужно (и сколько нужно).
Все остальные методы (
Response.json(),
Response.text() и т.д ) являются просто хелперскими обертками над стримом и соответственно будут асинхронными.
Таким образом мы не делаем лишней работы и получаем тело ответа только в том случае, если оно нам действительно надо.