A partire da crbug.com/73313, Chrome 13 e FF5 supportano l'invio di un ArrayBuffer
(o array di tipo) a/da un web worker. Ad esempio:
worker.js
self.onmessage = function(e) {
var uInt8Array = e.data;
postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};
main.html
var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}
console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);
worker.postMessage(uInt8Array);
Perché sono così entusiasmanti?...i dati binari!
Invece di serializzare i dati postMessage()
in un oggetto JSON, il browser utilizza l'algoritmo di clonazione strutturata per copiare ArrayBuffer
nel contesto del worker e viceversa. Ciò apre un potenziale reale per i lavoratori che non avevamo mai visto prima. In altre parole, essere in grado di trasmettere facilmente dati binari tra l'app principale e il thread di lavoro.
L'I/O con array di caratteri semplifica la manipolazione delle immagini, l'elaborazione del suono e i calcoli WebGL complessi. Ad esempio, è possibile leggere un file come array buffer o recuperare un blob utilizzando XHR2 e passare il risultato direttamente a un worker. Non è più necessaria la codifica Base64 dei dati :)
Secondo me questa è una di quelle peculiarità che i lavoratori avrebbero dovuto includere fin dall'inizio. È logico.