执行'postMessage'失败:索引0的值不具备可传递类型。

9

这是我的工作者代码:

onmessage = function (event) {
    postMessage({'data': event.data}, ['http://localhost:9000']);
};

以下是我使用worker的代码:

var worker = new Worker("/path/to/my/worker.js");
worker.onmessage = function (event) {
    console.log("RECEIVED: ", event.data);
};
worker.onerror = function (err) {
    console.log('ERROR: ', err)
};
worker.postMessage({'data': 'blabla', 'msg': 'Hi'});

但是当在worker代码中调用postMessage时,会出现以下错误: “Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope': Value at index 0 does not have a transferable type。”
我也尝试使用以下代码将对象序列化:
onmessage = function (event) {
        postMessage(JSON.stringify({'data': event.data}), ['http://localhost:9000']);
    };

但是什么都没有改变。

------ 编辑 ----------------------------------------------------------------

我在工作文件中尝试了以下代码:

function count() {
    var i = 0;
    self.onmessage = function (event) {
        postMessage("Hello " + event.data);
    };

    for (i = 0; i < 5; i++) {
        postMessage(i);
    }
    postMessage("Finished");
}

count();

在 onmessage 函数中的 postMessage 是唯一给我报错的。

1个回答

6
Worker.postMessage()的第二个参数应该存放一个对象列表,这些对象需要在主窗口中拥有所有权。但只有某些特定类型(大多数为ArrayBufferBitmap)可以传递。
解释错误信息:您的第二个参数是["some string"],其中"some string"位于索引0处,JS认为您想要传输该对象(这显然不是您的意图)。
只需删除['http://localhost:9000']即可解决问题。
详见https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage了解详情和示例。

3
请看这里以了解可以作为第二个参数传递的对象类型:https://developer.mozilla.org/zh-CN/docs/Web/API/Transferable。 - jackdbd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接