A partire da crbug.com/73313, Chrome 13 e FF5 supportano l'invio di un ArrayBuffer
(o array typed) 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é è entusiasmante?...dati binari!
Anziché serializzare i dati postMessage()
in un oggetto JSON, utilizza l'algoritmo di clone strutturato per copiare ArrayBuffer
nel contesto del worker e viceversa. Questo crea un reale potenziale per i lavoratori che non abbiamo mai visto prima. Ciò significa che è possibile passare facilmente dati binari tra l'app principale e il thread di lavoro.
L'I/O degli array digitati rende molto più fattibili la manipolazione delle immagini, l'elaborazione del suono e pesanti calcoli WebGL. Ad esempio, potresti leggere un file come buffer di array o recuperare un BLOB utilizzando XHR2 e passare il risultato direttamente a un worker. Nessun'altra codifica Base64 per i dati :)
A mio parere, questa è una di quelle trucchetti che i lavoratori avrebbero dovuto includere sin dall'inizio. Ha senso.