Обработка ответа XMLHttpRequest с большими данными
Используя Chrome, я настраиваюXMLHttpRequest
:
const xhr = new XMLHttpRequest();
xhr.open(method, url, true);
...
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (isStatusCodeSuccess(xhr.status)) {
// handle response;
} else {
// handle error
}
}
};
xhr.addEventListener('progress', event => {
console.log(event.loaded, event.target.response.length);
});
xhr.send(data);
В какой-то момент я запрашиваю некоторые данные JSON, общий размер которых составляет около 295 МБ без сжатия / 5,8 МБ сжатых. К сожалению, когда следующий код вызывается в случае успеха, ответ является пустой строкой.
Используя прослушиватель событий прогресса, я вижу, что ответ корректно обрабатывается порциями, вплоть до определенной точки. Вот выдержка из журналов консоли, которые он производит:
32768 32768
4639135 4639135
7376739 7376739
11525403 11525403
...
261489180 261489180
264684030 264684030
267880247 267880247
271037819 0
274232442 0
277428774 0
...
304018210 0
309230213 0
310445469 0
Похоже, что в Chrome есть ограничение на строку / распределение, но я не получаю никакой ошибки.
На Firefox я получаю следующую ошибку:InternalError: allocation size overflow
.
Я попытался сохранить результат как он есть, но я не могу «очистить» объект Xml Http Request, поскольку атрибуты доступны только для чтения.
Какое официальное ограничение для переменных в браузерах? Я не мог найти официальный ответ, только некоторые экспериментальныеОграничение размера строки Javascript: 256 МБ для меня - это одинаково для всех браузеров?
Есть ли способ обойти эту проблему и обработать большой результат POST? кроме использования WebSocket.
Я думаю о:
определенный тип контента для потоковой передачи данных, напримерapplication/octet-stream
конкретный параметр для обработки данных по чанку, напримерспектр заголовок, хотя содержимое, которое я извлекаю, не является статичным (оно меняется со временем)известный алгоритм для уменьшения длины ответа JSON, где я могу разархивировать фрагмент путем фрагментирования данных, чтобы избежать нарушения вышеуказанного ограничения