Why can't Web Worker call a function directly?

前端 未结 7 1116
借酒劲吻你
借酒劲吻你 2021-02-01 03:15

We can use the web worker in HTML5 like this:

var worker = new Worker(\'worker.js\');

but why can\'t we call a function like this?



        
7条回答
  •  灰色年华
    2021-02-01 03:41

    This question has been asked before, but for some reason, the OP decided to delete it.
    I repost my answer, in case one needs a method to create a Web worker from a function.


    In this post, three ways were shown to create a Web worker from an arbitrary string. In this answer, I'm using the third method, since it's supported in all environments.

    A helper file is needed:

    // Worker-helper.js
    self.onmessage = function(e) {
        self.onmessage = null; // Clean-up
        eval(e.data);
    };
    

    In your actual Worker, this helper file is used as follows:

    // Create a Web Worker from a function, which fully runs in the scope of a new
    //    Worker
    function spawnWorker(func) {
        // Stringify the code. Example:  (function(){/*logic*/}).call(self);
        var code = '(' + func + ').call(self);';
        var worker = new Worker('Worker-helper.js');
        // Initialise worker
        worker.postMessage(code);
        return worker;
    }
    
    var worker = spawnWorker(function() {
        // This function runs in the context of a separate Worker
        self.onmessage = function(e) {
            // Example: Throw any messages back
            self.postMessage(e.data);
        };
        // etc..
    });
    worker.onmessage = function() {
        // logic ...
    };
    worker.postMessage('Example');
    

    Note that the scopes are strictly separated. Variables can only be passed and forth using worker.postMessage and worker.onmessage. All messages are structured clones.

提交回复
热议问题