HTML5 Web Worker通信

时间:2013-08-05 11:04:17

标签: javascript html5 web-worker

我正在尝试提出一种在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返回的值,但只能通过调用另一个函数并将其存储为全局变量。

3 个答案:

答案 0 :(得分:3)

与工作人员进行通信不能同步进行,因为他们在不同的线程中运行。 您必须使用回调来实现此通信。

如果你想让你的代码看起来比回调“厄运金字塔”更优雅,你可以接受Promise模式,你可以使用QjQuery.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)

查看vkThread插件。我想,这正是你要找的。该插件允许您在线程中执行代码的任何功能。

http://www.eslinstructor.net/vkthread/

希望这有帮助,

- 瓦迪姆

答案 2 :(得分:-1)

(在其他任何地方找不到解决方案之后)我已经提出了一个相当直接的模式,通过需要访问调用代码的回调与网络工作者进行通信:https://gist.github.com/therightstuff/eb415798b0e30866fe85d66af68969cf

编辑:哇,回头看我原来的帖子,我想知道我当时是不是中风。该链接已更新