Почему <Memory>нельзя было клонировать? - PullRequest
1 голос
/ 12 января 2020

Я написал код в javasctipt, который использует WebAssembly.Memory, и я хочу использовать эту память в веб-работнике. Это мой код:

var memory = new WebAssembly.Memory({initial:10});
var counter = new Worker("counter.js");
counter.postMessage(memory);
var arr = new Uint32Array(memory.buffer);
//other statements of the code...

ошибка chrome: Uncaught DOMException: Не удалось выполнить 'postMessage' для 'Worker': # не удалось клонировать. в http://127.0.0.1: 8000 / main. js: 3: 9

В чем причина этой ошибки? Спасибо.

1 Ответ

0 голосов
/ 12 января 2020

Вы только что использовали new с WebAssembly.Memory в самой первой строке кода, верно? Это означает, что WebAssembly.Memory - это не просто буфер, а экземпляр класса с методами.

Как правило, вы не можете напрямую передать функцию веб-работнику и не можете просто postMessage() объект с методами ни Вместо этого вы должны передать его как Arraybuffer или Array.

var memory = new WebAssembly.Memory({initial:10});
var counter = new Worker("counter.js");

// Do not transfer wasm buffer by passing [memory.buffer]
// in the second argument.
// That will break the current WebAssembly program
// Since it will loose its ownership of the memory.
counter.postMessage(memory.buffer);

// A safer way is duplicating the buffer.
// By passing memory view instead of the buffer you will get a copy of the buffer.
var dupArr = new Uint32Array(memory);
counter.postMessage(dupArr, [dupArr]);

//other statements of the code...
...