TypeError:没有足够的Window.postMessage参数

时间:2014-09-29 12:33:38

标签: javascript

我正在了解网络工作者。我正在使用以下教程

https://developer.mozilla.org/en/docs/Web/Guide/Performance/Using_web_workers

到目前为止,它有效。我有以下代码

var worker = new Worker('thing.js');

worker.addEventListener('message', function(e) {
    alert("Worker said: " +  e.data);
}, false);

worker.postMessage("Test me");

和我的thing.js文件

self.addEventListener('message', function(e) {
   self.postMessage(e.data);
}, false);

以上工作正常。

但是,我需要将一条消息从我的thing.js传递回我的主js文件,以证明它传回了进度更新。

同样,教程显示我可以这样做,所以我有以下更新的代码

var worker = new Worker('thing.js');

worker.addEventListener('message', function(e) {
    alert("Worker said: " +  e.data);
}, false);

worker.postMessage("Test me");  

和我的thing.js

self.addEventListener('message', function(e) {
  self.postMessage(e.data);
}, false);

function DoThisThing() {
    postMessage("I should ALSO be working but I am not.");
}

此操作失败并显示错误消息(在FireBug中):

  

TypeError:没有足够的Window.postMessage参数。

我看不出我做错了什么。

1 个答案:

答案 0 :(得分:2)

拥有触发问题的完整源代码会很方便,但我敢打赌,问题是除了实例化worker之外,你的代码还通过脚本标记包含了worker文件。类似的东西:

<script type="text/javascript" src="thing.js"></script>

所以基本上你拥有的是:

thing.js (工人)

   self.addEventListener('message', function(e) {
      self.postMessage(e.data);
    }, false);

    function DoThisThing() {
        postMessage("I should ALSO be working but I am not.");
    }

    DoThisThing();

我假设您正在调用DoThisThing(),否则您将无法获得"TypeError: Not enough arguments to Window.postMessage"错误。

如果您按原样运行代码,但您也会看到错误。

TypeError: Not enough arguments to Window.postMessage.
Worker said: I should ALSO be working but I am not.  
Worker said: Test me

那么是什么触发了TypeError:没有足够的参数......?如果您从script标签获取文件,则该函数实际执行两次。在第一次通话时,出现了错误。

当脚本标记获取thing.js时,DoThisThing()会被执行。这是第一次通话。 DoThisThing()调用postmessage(与self.postmessage相同)。但此调用已解决为window.postmessage。此方法需要第二个参数(targetOrigin)。

但是,当工作人员被执行时,对postmessage的调用(与self.postmessage相同)将被解析为DedicatedWorkerGlobalScope.postmessage。这种方法不需要第二个参数。

当您向postmessage添加第二个参数时,您解决了第一个调用的问题,但没有解决第二个问题。因此,您遇到了一个新错误:&#34; TypeError:DedicatedWorkerGlobalScope.postMessage的参数2无法转换为序列&#34;。

总结一下,有两种类型的postmessages,一种属于window对象,另一种属于DedicatedWorkerGlobalScope对象。对postmessage的简单调用通常由DedicatedWorkerGlobalScope对象解决。此呼叫便于与其父母沟通工作人员。 window.postmessage需要第二个参数来指定targetOrigin。此调用便于跨源通信。

在您的情况下,问题的可能原因是从script标记中获取工作者JavaScript文件。这导致postmessage被窗口解析,这需要第二个参数。