Как передать несколько данных в массиве в качестве передаваемого объекта
Чтобы передать отдельные изображения в рабочий поток, я делаю что-то вроде следующего
var image = ctx.getImageData(0, 0, data.width, data.height));
var tData = new Uint8ClampedArray(data.width*data.height*4);
tData.set(image.data);
let message = {function: "my function", buffer: tData.buffer}
worker.postMessage(message, [tData.buffer]);
Это хорошо работает для отдельных изображений, но теперь я хочу отправить переменное количество изображений с помощью цикла. Отправка нескольких массивов разрешена в спецификации (например, worker.postMessage(message, [array1, array2]);), но тогда вы не можете динамически изменять количество изображений.
let imageDataArray=[];
for(let i=0;i<images.length;i++){
var tData = new Uint8ClampedArray(data.width*data.height*4);
tData.set(images[i].data);
imageDataArray.push(tData.buffer);
}
let message = {function: "my function", buffer: imageDataArray}
worker.postMessage(message, [imageDataArray]);
но это просто не работает правильно, так как тип данных не может быть передан. Есть ли правильный способ сделать это?
Uncaught TypeError: Failed to execute 'postMessage' on 'Worker': Value at index 0 does not have a transferable type.
1 ответ
Последняя строка должна быть (примечание: квадратные скобки не нужны).
worker.postMessage(message, imageDataArray);
Затем в рабочем доступ к данным, как
let imageIndex = 0;
let buf = event.data.buffer[imageIndex];
let image = new Uint8Array(buf);
// do something with image
// ....
// return it back
postMessage(event.data, event.data.buffer);
тогда в вызывающей функции к ней должен обращаться индекс массива
var image = new Uint8ClampedArray(event.data.buffer[imageIndex]);
тогда вы можете использовать его как
let imageData = ctx.getImageData(0, 0, width, height);
imageData.data.set(image);
// write the data to the canvas
ctx.putImageData(imageData, 0, 0);
Не все браузеры поддерживают несколько изображений, поэтому сначала следует проверить совместимость, выполнив фиктивный тест с аргументом массива для рабочего.