В отличие от XMLHttpRequest Fetch API поддерживает
полноценный стриминг.
Берешь из респонса ридер
response.getReader()
и считываешь данные вручную по частям по мере поступления. JSON файл, естетственно, парсить придется тоже вручную, т.к.
JSON.parse
не будет работать с невалидным JSON, чем недокаченный файл и будет являться.
Делается по аналогии с этим:
https://learn.javascript.ru/fetch-progress
---
С XMLHttpRequest можно сделать
недостриминг при использовании
responseType: "text"
(по-умолчанию). В таком случае при каждом вызове
onprogress
или
onreadystatechange
можно читать обновленный (с добавленными данными)
xhr.responseText.