2013-09-23 19 views
6

Şu anda, ikili verilerle kısmi XHR yanıtlarını okuma olasılığını araştırıyorum. Mevcut yaklaşımımız 'responseText' özelliğine ve base64 kodlamasına dayanmaktadır. Açıkçası, bu optimal olmaktan uzak.İkili veriler için kısmi XHR yanıt okuması mümkün mü?

biz xhr kullanılarak kısmi kabarcık/ArrayBuffer yanıtları okuyabilir nasıl? Chrome'da denediğimde, tüm ArrayBuffer/Blob, readyState = 4 olduğunda kullanılabilir, ancak bundan önce olmaz.

bana öyle geliyor Özetlemek gerekirse o:

  • Okuma xhr en responseText özelliği: Yanıtlar readyState = 4 önce okunabilir ve geri istemciye ikili veri base64 olarak kodlanmış yayınlayabilirsiniz
  • Okuma XHR en responseType = 'arraybuffer' ile cevap özelliği: readyState = 4

burada bir şey eksik olduğunda kısmi yanıt okuma, ancak tüm tampon kullanabilir? Kısmi ikili yanıtları okumak için hangi yaklaşımı alabilirdik? henüz standart olmasa

cevap

3

, the fetch API şu anda supported by Firefox and Chrome gözlerini tutun. Bir XHR yedek readableStream, getirme gibi

+0

Teşekkürler! Bunu yapmanın yolu gibi görünüyor. Ek bir avantaj olarak, bizim durumumuzda, destekleyici olmayan tarayıcılar için standart bir XHR isteğini kolayca kullanabiliriz. – bjornl

5

, bir yolu yoktur. Firefox, hangisinin sizin için çalıştığına bağlı olarak XHR üzerinde responseType'u "moz-blob", "moz-chunked-text" veya "moz-chunked-arraybuffer" olarak ayarlamanıza izin verir. Eğer progress olayı dinlemek ne zaman geliyor Sonra, kısmi verilere erişmek mümkün olacak. MDN here ve here bu konuda fazla bilgiye sahiptir.

Krom Streams API destekleyecek, ancak not ready yet bu. Firefox ayrıca eventually destekleyebilir. Bunu yapmak için herhangi bir resmi belge bulamamış olsam da, IE'nin zaten yaptığı bir yeri okudum.

+0

Cevabınız için teşekkür ederiz. Akış/parçalama mekanizmamızı zaten uyguladık. Bu, base64 kodlamasına ve responseType = metnine dayanmaktadır, çünkü günümüzde en çok desteklenen çözüm budur. – bjornl

+0

Yaklaşımımızı, özel bir protokole göre bölünmüş ikili çoğullu WebSocket iletişimine daha fazla dayanacak şekilde değiştirebilir. Topakların verimli çoğullamaya izin vermek için fakat aynı zamanda bir kopukluğu güvenilir bir şekilde algılayabilmeleri için oldukça küçük ve öngörülebilir bir büyüklükte olması gerekir. Şimdilik uygulanabilir bir seçenek olarak görünüyor. – bjornl

+0

Evet, Websockets bunun için bir sunucunuz olduğunu varsayarak başka iyi bir seçenektir. – brianchirls

1

iyi API kullanmak.

Bu burada açıklanmıştır: https://developers.google.com/web/fundamentals/primers/async-functions#example_streaming_a_response

Chrome, destekler. Firefox bunu uygular ancak an için manuel olarak etkinleştirilmelidir (bu, gelecekteki bir sürümde varsayılan olarak etkinleştirilecektir). Bu aktivasyon için beklerken kütüphane https://www.npmjs.com/package/fetch-readablestream bu iki yöntem uygulayan bir API önermektedir Moz-yığını-arraybuffer

Firefox standart dışı tepki türü ile xhr uygular. https://www.npmjs.com/package/web-streams-polyfill kullanır.

İlgili konular