Возможно ли частичное чтение ответа XHR для двоичных данных?

В настоящее время я изучаю возможность чтения частичных XHR-ответов с помощью двоичных данных. Наш текущий подход основан на свойстве responseText и кодировке base64. Понятно, что это далеко не оптимально.

Как мы можем прочитать частичные ответы Blob/ArrayBuffer, используя XHR? Когда я пытаюсь в Chrome, весь ArrayBuffer/Blob становится доступным, когда readyState = 4, но не раньше.

Подводя итог, мне кажется, что:

  • Чтение свойства responseText XHR: ответы могут быть прочитаны до готовности ReadyState = 4, и мы можем передавать двоичные данные в кодировке base64 обратно клиенту
  • Чтение свойства ответа XHR с responseType = 'arraybuffer': частичное чтение ответа отсутствует, но весь буфер становится доступным, когда readyState = 4

Я что-то здесь упускаю? Какой подход мы можем использовать для чтения частичных двоичных ответов?

3 ответа

Решение

Следите за API выборки, который в настоящее время поддерживается Firefox и Chrome.

Есть способ, хотя он пока не стандартный. Firefox позволяет установить responseType в XHR для "moz-blob", "moz-chunked-text" или "moz-chunked-arraybuffer", в зависимости от того, какой из них работает для вас. Затем, когда вы слушаете progress событие, вы сможете получить доступ к частичным данным по мере их поступления. MDN имеет больше информации об этом здесь и здесь.

Chrome будет поддерживать Streams API, но пока не готов. Firefox также может в конечном итоге поддержать его. Я где-то читал, что IE уже делает, хотя я не могу найти официальную документацию, чтобы подтвердить это.

Лучший API для использования в качестве замены XHR - это выборка с readableStream.

Это объясняется здесь: https://developers.google.com/web/fundamentals/primers/async-functions

Chrome уже поддерживает это. Firefox реализует его, но на данный момент его необходимо активировать вручную (он будет активирован по умолчанию в будущей версии). В ожидании этой активации Firefox реализует XHR с нестандартным типом ответа moz-chunked-arraybuffer

Библиотека https://www.npmjs.com/package/fetch-readablestream предлагает API, который реализует эти два метода. Он использует https://www.npmjs.com/package/web-streams-polyfill.

Другие вопросы по тегам