2013-09-23 22 views
6

Obecnie badam możliwość czytania częściowych odpowiedzi XHR z danymi binarnymi. Nasze obecne podejście opiera się na właściwości "responseText" i kodowaniu base64. Oczywiście nie jest to optymalne.Częściowe czytanie odpowiedzi XHR dla danych binarnych, możliwe?

Jak możemy odczytać częściowe odpowiedzi Blob/ArrayBuffer używając XHR? Kiedy próbuję w Chrome, cały ArrayBuffer/Blob jest dostępny, gdy readyState = 4, ale nie wcześniej.

Podsumowując, wydaje mi się, że:

  • nieruchomość responseText Reading XHR za: Odpowiedzi można przeczytać zanim readyState = 4, i możemy przesyłać base64 zakodowane dane binarne z powrotem do klienta
  • Reading XHR użytkownika Właściwość response z responseType = 'arraybuffer': Brak częściowego odczytu odpowiedzi, ale cały bufor jest dostępny, gdy readyState = 4

Czy brakuje mi tutaj czegoś? Jakie podejście możemy zastosować, aby przeczytać częściowe odpowiedzi binarne?

Odpowiedz

3

Obserwuj na bieżąco the fetch API, obecnie supported by Firefox and Chrome.

+0

Dzięki! To wygląda na to, jak to zrobić. Dodatkową korzyścią jest to, że w naszym przypadku możemy łatwo użyć standardowego żądania XHR dla nie wspierających przeglądarek. – bjornl

5

Jest sposób, choć nie jest jeszcze standardowy. Firefox pozwala ci ustawić responseType na XHR na "moz-blob", "moz-chunked-text" lub "moz-chunked-arraybuffer", w zależności od tego, który z nich działa. Następnie, gdy będziesz słuchać wydarzenia progress, będziesz mógł uzyskać dostęp do częściowych danych w miarę ich pojawiania się. MDN ma więcej informacji na temat tego here i here.

Chrome obsługuje Streams API, ale jest to not ready yet. Firefox może również obsługiwać go przez eventually. Czytałem gdzieś to, co IE robi, chociaż nie mogę znaleźć żadnej oficjalnej dokumentacji, która to potwierdziłaby.

+0

Dzięki za odpowiedź. Wdrożyliśmy już nasz mechanizm przesyłania strumieniowego/porcjowania. Jest oparty na kodowaniu base64 i responseType = text, ponieważ wydaje się, że jest to obecnie najbardziej rozpowszechnione rozwiązanie. – bjornl

+0

Może zmienić nasze podejście do sposobu polegającego bardziej na binarnej multipleksowanej komunikacji WebSocket, porwanej zgodnie z zastrzeżonym protokołem. Fragmenty muszą być raczej małe i mieć przewidywalny rozmiar, aby umożliwić wydajne multipleksowanie, ale także niezawodnie być w stanie wykryć rozłączenie. Na razie wydaje się być realną opcją. – bjornl

+0

Tak, Websockets to kolejna dobra opcja, zakładając, że masz do tego serwer. – brianchirls

1

Najlepszym API do użycia jako zamiennik XHR jest pobranie z readableStream.

to wyjaśnione tutaj: https://developers.google.com/web/fundamentals/primers/async-functions#example_streaming_a_response

Chrome obsługuje go już. Firefox ją implementuje, ale musi być na razie aktywowany ręcznie (domyślnie będzie aktywowany w przyszłej wersji). Podczas oczekiwania na tę aktywację, Firefox implementuje XHR z niestandardowym typem odpowiedzi, moz-chunked-arraybuffer

Biblioteka proponuje bibliotekę, która implementuje te dwie metody. Używa https://www.npmjs.com/package/web-streams-polyfill.