2016-12-11 1 views
1

Je suis en train de créer Blob de ArrayBuffer en utilisant .slice(), parce que je dois copier ArrayBuffer depuis que je sais que ce sera changé à l'avenir (son byteLength sera 0) par le code que je n'ai pas le contrôle/que je veux changer.ne peut pas effectuer ArrayBuffer.prototype.slice sur une maison individuelle ArrayBuffer

new Blob([data2.payload.slice()], {type: "video/MP2T"}) 

Et j'obtiens l'erreur

Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer 

sur

Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 

sur Windows 7 x64.

Existe-t-il d'autres moyens de copier ArrayBuffer? This way not does actual copy, other ways does not seems to be pretty straightforward.

ArrayBuffer.transfer() semble bon, mais leur polyfill produit erreur

Source and destination must be ArrayBuffer instances 
+0

[Obtenir des données BLOB à partir de la requête XHR] (http://stackoverflow.com/questions/8022425) –

+0

@SenJacob 'new DataView (arrayBuffer)' ne fonctionne pas, car il ne copie rien. – galeksandrp

Répondre

1

Il est de ma faute, j'a été confondu par un message d'erreur pas clair , dans cette situation, rien ne peut être fait depuis au moment de Blob créant data2.payload est déjà byteLength: 0.

Bien que dans le cas d'habitude avec

var from = new ArrayBuffer(0); 
var to = from.slice(); 
var to = from.slice(0); 

to sera ArrayBuffer avec byteLength: 0, dans ce cas, il est d'erreur de déclenchement, car avant data2.payload passé à mon code il est modifié travailleur web, afin d'éviter la copie du fragment entre le thread principal et le travailleur Web, data2.payload la propriété est transférée au travailleur.

+0

Comment son byteLength est-il mis à 0? – Kaiido

+0

ah oui transférable ... Oublié ça et oui ça explique toutes tes erreurs. – Kaiido

0

Essayez d'utiliser new Blob([new Uint8Array(data2.payload.slice(0))], {type: "video/MP2T"})

Voir en this fiddle

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "https://fiddle.jshell.net/img/logo.png", true); 
xhr.responseType = "arraybuffer"; 
xhr.onload = function(e) { 
    var binaryArray = new Uint8Array(this.response.slice(0)); // use UInt8Array for binary 
    var blob = new Blob([binaryArray], { type: "image/png" }); 
    var URL = window.URL || window.webkitURL; 
    var imageUrl = URL.createObjectURL(blob); // create url 
    document.getElementById("image").src = imageUrl; 
}; 
xhr.send(); 
+0

Essayé, même résultat. – galeksandrp

+0

Essayez d'utiliser UInt8Array pour créer Blob. Cela a fonctionné pour moi avant. –

+0

Essayé, il ne copie pas 'ArrayBuffer' maintenant. – galeksandrp