如何在 Web Worker 中使用其他库?

发布于 2025-01-03 20:16:50 字数 762 浏览 0 评论 0原文

我有一些像这样的 javascript 代码,

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

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

worker.js 看起来像这样,

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();
    }
});
}

worker.js 文件没有包含 jQuery,所以不起作用。如果我将其添加到worker.js,

importScripts("jQuery.js");

那么我会收到消息,

Uncaught ReferenceError: window is not defined

我不太熟悉workers。我的想法是否正确,它正在完全独立的环境(基本上是后台线程)中加载worker.js代码,因此它无法访问window.js。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

美羊羊 2025-01-10 20:16:50

在工作人员的 .js 文件上:

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

On the worker's .js file:

importScripts('../relative/path/lib.min.js', '../../other/lib.js');
单身狗的梦 2025-01-10 20:16:50

为了防止 Web Worker 遇到并发问题,Web Worker 规范阻止 Worker 访问窗口对象或 DOM。

工作线程中唯一可用的对象和方法有:

  1. 导航器对象
  2. 位置对象
  3. XMLHttpRequest
  4. setTimeout 和clearTimeout 函数。
  5. 应用程序缓存
  6. 生成其他 Web Worker
  7. 使用 WebWorker 特定方法加载其他脚本

因此,虽然您可以使用 Worker 手动创建 XMLHttpRequest; Jquery 或任何其他期望能够访问 DOM 或 Window 对象的库永远不会在那里工作。

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.

白芷 2025-01-10 20:16:50

是的,已经正确地向我指出 ajax 调用是异步的,因此不需要工作人员。对于我不会解释的情况,事实证明 ajax 调用无论如何都不起作用,所以我恢复到 XMLHttpRequest 的原样并使用工作人员保留它。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文