我正在尝试提出一种在Web worker脚本中调用函数并让它们将值返回到主脚本的好方法,我发现很难想出一些可扩展的东西。它是异步的,通过消息完成,任何帮助将非常感激。这是我的网络工作者脚本......
self.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'call' :
self[data.funcName](data.args);
break;
default:
self.postMessage('Unknown command: ' + data.msg);
};
}, false);
function testWorkerFunction(args) {
self.postMessage({'cmd': 'call', 'funcName': 'testClientFunction', 'args': args});
}
这是我的主要剧本。
$(function() {
var someOtherVal;
worker = new Worker('js/workers/uc-main-worker.js');
worker.addEventListener('message', function(e) {
console.log('Worker said: ', e.data);
var data = e.data;
switch (data.cmd) {
case 'call' :
self[data.funcName](data.args);
break;
default:
console.log('Unknown command');
break;
};
}, false);
worker.onerror = function(e){
throw new Error(e.message + " (" + e.filename + ":" + e.lineno + ")");
};
/* This is the bit I need some help with, how I can return a value back here */
var someVal = messageWorker({'cmd': 'call', 'funcName': 'testWorkerFunction', 'args': 'hello'});
//Not sure how to get a value back without invoking a function in the main script because I have to use messaging.
});
function messageWorker(message) {
worker.postMessage(message);
}
function testClientFunction(args) {
//Simply storing it as a global var.
someOtherVal = args;
}
希望从我的代码中了解我所追求的目标,目前我可以获得testWorkerFunction返回的值,但只能通过调用另一个函数并将其存储为全局变量。
答案 0 :(得分:3)
与工作人员进行通信不能同步进行,因为他们在不同的线程中运行。 您必须使用回调来实现此通信。
如果你想让你的代码看起来比回调“厄运金字塔”更优雅,你可以接受Promise模式,你可以使用Q或jQuery.deferred()
修改强> 如果要使用“清除”回调,可以将 messageWorker 方法更改为如此。
function messageWorker(message, callback) {
function listen(e){
if (e.data.funcName === message.funcName){
worker.removeEventListener("message". listen);
callback(e.data.args);
}
}
worker.addEventListener("message", listen)
worker.postMessage(message);
}
答案 1 :(得分:0)
答案 2 :(得分:-1)
(在其他任何地方找不到解决方案之后)我已经提出了一个相当直接的模式,通过需要访问调用代码的回调与网络工作者进行通信:https://gist.github.com/therightstuff/eb415798b0e30866fe85d66af68969cf
编辑:哇,回头看我原来的帖子,我想知道我当时是不是中风。该链接已更新