HTML5 Web Worker Communication
HTML5 Web Worker Communication
我正在尝试想出一种在web工作程序脚本中调用函数并让它们向主脚本返回值的好方法,我发现很难找到可扩展的东西,因为它是异步的,并且是通过消息传递完成的,任何帮助都将不胜感激。这是我的网络工作者脚本。。。
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返回的值,但只能通过调用另一个函数和/或将其存储为全局变量。
与Workers的通信不能同步完成,因为它们在不同的线程中运行。你必须使用回调来实现这种沟通。
如果你想让你的代码看起来比回调"末日金字塔"更优雅,你可以接受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);
}
看看vkThread插件。我想,这就是你想要的。这个插件允许您在线程中执行代码的任何函数。
http://www.eslinstructor.net/vkthread/
希望这能有所帮助,
--Vadim
(在其他地方找不到解决方案后)我提出了一个相当简单的模式,用于通过需要访问调用代码的回调与web工作者进行通信:https://gist.github.com/therightstuff/eb415798b0e30866fe85d66af68969cf
编辑:哇,回头看我原来的帖子,我想知道当时我是不是中风了。链接已更新
相关文章:
- 在同一个服务工作者中处理service-worker.js有任何影响吗
- 使用Emscripten Worker API传输数据而不进行复制
- 当我尝试运行mocha测试时,没有定义Worker
- 在Service worker中使用setInterval
- Web Worker postMessage({})何时返回给调用者
- Web Worker 能否利用 100% 的多核 CPU
- Ajax-PhP communication
- 三.js:如何从Web-worker加载动画.json模型
- 从 Web Worker 执行 AJAX 请求是否可行
- 在Web Worker中将SVG转换为PNG
- Apache Thrift Java-Javascript communication
- 如何通过HTTPS加载Web Worker脚本
- PHP, Java Applet communication
- Node.js:集群中具有差异代码的Worker
- Javascript and Java Communication
- 当浏览器关闭时,运行Web Worker会发生什么情况
- JavaScript:不允许Web Worker使用(例如)XmlHttpRequest
- Parent-Iframe postMessage communication
- js-worker和phonegap上的websql数据库
- HTML5 Web Worker Communication