1

我试图想出一种在网络工作者脚本中调用函数并让它们将值返回到主脚本的好方法,我发现很难想出一些可扩展的东西,因为它是异步的并且通过消息传递,任何帮助将不胜感激。这是我的网络工作者脚本...

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 返回的值,但只能通过调用另一个函数或将其存储为全局变量。

4

3 回答 3

3

与 Worker 的通信不能同步完成,因为它们在不同的线程中运行。您必须使用回调来实现这种通信。

如果你想让你的代码看起来比回调“末日金字塔”更优雅,你可以采用 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);
}
于 2013-08-05T11:21:10.423 回答
0

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

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

希望这可以帮助,

——瓦迪姆

于 2013-09-16T06:34:13.327 回答
-1

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

编辑:哇,回顾我原来的帖子,我想知道我当时是否没有中风。链接已更新

于 2017-01-16T21:59:59.237 回答