Lac*_*lan 20 javascript web-worker
我想通过一个函数(或函数)传递postMessage()给一个web worker,因为我不能引用常规文件.
为了关闭Web工作者,我将对象URL(从Blob创建)传递给Worker构造函数.然后我传递了一条消息,但到目前为止没有运气在消息中添加功能.
(JSON)消息不能直接包含函数(如此处所述),虽然理论上允许使用importScripts,但到目前为止我还没有在Chrome或Firefox中使用过它.
html文件的正文:
<div id="divText">1234</div>
<script>
var greeter = function greet(name) {
return "hello " + name;
};
function webWorkerWorker() {
self.postMessage("started1");
self.onmessage = function(event) {
importScripts(event.data.content);
self.postMessage("importScripts success");
var result = greeter("john");
self.postMessage(result);
};
}
var functionBody = mylib.extractFunctionBody(webWorkerWorker);
var functionBlob = mylib.createBlob([functionBody]);
var functionUrl = mylib.createObjectURL(functionBlob);
var functionBody2 = mylib.extractFunctionBody(greeter);
var functionBlob2 = mylib.createBlob([greeter]);
var functionUrl2 = mylib.createObjectURL(functionBlob2);
var worker = new Worker(functionUrl);
worker.onmessage = function(event) {
document.getElementById("divText").innerHTML = event.data;
}
worker.postMessage({
type: "init",
content: functionUrl2
});
</script>
Run Code Online (Sandbox Code Playgroud)
目前,它会将divText值设置为"importScripts success".
难道我做错了什么?还有另一种方法可以将函数传递给Web worker吗?还是不可能?
事实证明这种方法工作正常,我的工作者只有一个错误:
var result = greeter("john");
Run Code Online (Sandbox Code Playgroud)
应该
var result = greet("john");
Run Code Online (Sandbox Code Playgroud)
这是有意义的 - 我将greeter变量传递给worker,但是没有理由知道我传递的对象的变量名.
对于那些正在寻找更通用答案的人:这是一个插件,它使您可以在线程中执行javascript代码的任何功能。
http://www.eslinstructor.net/vkthread/
将其视为“功能外包”。您将任何函数作为参数传递给插件,并在回调中获得结果。您还可以“外包”对象的方法,具有依赖关系的函数,匿名函数和lambda。
请享用。
-瓦迪姆