peter
peter

Reputation: 13491

How Can I use Other Libraries in a Web Worker?

I have some javascript code like this,

var worker = new Worker("javascript/worker.js");

worker.onmessage = function(evt)
{
    // stuff
}

worker.js looks like this,

importScripts("base.js");

function getImage()
{
    $.ajax({
    url: 'URL'
    dataType: "text/plain; charset=x-user-defined",
    mimeType: "text/plain; charset=x-user-defined",
    success: function(data, textStatus, jqXHR)
    {
        callback();
    }
});
}

The worker.js file does not have jQuery included so that doesn't work. If I add this to worker.js,

importScripts("jQuery.js");

Then I get the message,

Uncaught ReferenceError: window is not defined

I'm not really familiar with workers. Am I right in thinking this it is loading the worker.js code in a completely separate environment (basically a background thread) so it doesn't have access to window.

Upvotes: 7

Views: 12793

Answers (3)

REAPP3R
REAPP3R

Reputation: 206

On the worker's .js file:

importScripts('../relative/path/lib.min.js', '../../other/lib.js');

Upvotes: 14

Racheet
Racheet

Reputation: 740

In order to prevent web workers from running into concurrency problems, the web worker spec prevents the worker from having access to the window object or the DOM.

The only objects and methods available inside a worker are:

  1. The navigator object
  2. The location object
  3. XMLHttpRequest
  4. The setTimeout and clearTimeout functions.
  5. The Application Cache
  6. Spawning other Web Workers
  7. Using a webworker specific method to load other scripts

So whilst you could use the worker to create the XMLHttpRequest manually; Jquery or any other library which expects to be able to access the DOM or Window Object is never going to work in there.

Upvotes: 4

peter
peter

Reputation: 13491

Yeah it has been correctly pointed out to me that the ajax call is asynchronous so the worker is not required. For circumstances which I won't explain turns out that the ajax call didn't work anyway, so I reverted back to the XMLHttpRequest how it was and left it using a worker.

Upvotes: -1

Related Questions