JavaScript Web Workers - 如何传递参数?

39

我找到了解决我的一些问题的答案,那就是html5 web workers!!!

使用这个基本示例,我该如何传递参数给Web Worker呢?

worker.js文件的内容:

function doSomething() {
    postMessage( ' done');
}
setTimeout ( "doSomething()", 3000 );

JavaScript代码:

 var worker = new Worker('worker.js');
  worker.onmessage = function (event) {
    alert(event.data);
  };

3
请使用以下方式使用setTimeout:setTimeout(doSomething, 3000); 这样做更好,因为没有进行额外的计算... - Šime Vidas
https://developer.mozilla.org/En/Using_web_workers - epascarello
2个回答

55

如您所见,无论是从工作线程到主线程还是从主线程到工作线程,您都可以使用同样的机制来发送和接收消息:

  • postMessage 方法用于发送消息
  • onmessage 成员用于定义接收消息的处理程序

在主脚本中:

worker.postMessage(data);
在工作脚本中:
self.addEventListener("message", function(e) {
    // the passed-in data is available via e.data
}, false);

...或只是...

onmessage = function(e) {
    // the passed-in data is available via e.data
};

可能需要将数据转换为字符串...(Firefox 3.5+支持传递JSON兼容的对象)


1
在 self.addEventListener 中,self 是什么? - Andrei Cristian Prodan
2
@AndreiCristianProdan 工作线程的全局范围,类似于网页上的 window。文档:http://msdn.microsoft.com/zh-cn/library/windows/apps/hh453270.aspx - Šime Vidas
也许你应该看这里:https://dev59.com/mmct5IYBdhLWcg3wD5WU#55680502,因为他们描述了一种非常好的方法。 - hsc

0
 var worker = new Worker(window.App.baseUrl + '/Scripts/signature/GetCurrenProductWorker.js');
                    worker.postMessage(window.App.baseUrl)


    var _base_url = ''
        var xhr = new XMLHttpRequest();
        onmessage = function (e) {
            _base_url = e.data
            xhr.open("GET", _base_url + "/api/product/Get");
            xhr.onload = function () {
                postMessage(xhr.responseText);
            };
            xhr.send();

        };

这对我很有效


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