【问题标题】:Global variable in Web workerWeb Worker 中的全局变量
【发布时间】:2012-06-28 12:07:40
【问题描述】:

我正在使用这个 Web 工作者,它声明了一个全局变量。我可以在新生成的网络工作者(工作者 2)中访问相同的(工作者 1 中的全局变量)吗?

当我尝试在 web worker 中使用 jQuery 时,我收到错误“未定义窗口”。有没有办法在Web Worker 中使用 jQuery?

importScripts('jquery-latest.js'); 函数 fetch_ajax(url) { $.ajax({ 类型:'GET', 网址:网址, 成功:功能(响应){ postMessage(响应); } }); } fetch_ajax('test.txt');

【问题讨论】:

  • 您似乎在这里问了两个问题。 StackOverflow 问题应该分开放置。我很确定 jQuery 问题已经得到解答,因此最好从您的问题中删除该部分。

标签: javascript web-worker


【解决方案1】:

Web Workers 没有 window 对象。

要访问全局状态,请改用self,代码可以在主线程和工作线程上运行。

但请注意,您仍然无法访问或操作父 DOM(例如,通过 self.jQuery 获取 window.jQuery)。

虽然主线程窗口self 指向Window 对象,但在工作线程中self 指向一个单独的WorkerGlobalScope 对象。

【讨论】:

  • Tnx 我实际测试过,发现我无法在worker2 中访问worker1 中的变量。并且也无法使用 jQuery,因为无法访问 window 对象。相反,我使用了原生 XHR 并成功返回了响应...
  • 这是一件的事情。与工人的沟通是通过消息(PostMessage 方法和onmessage 事件)。访问 DOM 或一些共享变量会导致很多讨厌的错误...
  • 我的理解是,每个 web worker 中的全局作用域,以及主线程(网页)中,都是独立的,但是在每种情况下,它们都可以通过self 访问目的。在主线程中,selfwindow 的同义词。这也是你的理解,还是你的意思是别的?
  • @MichaelScheper 全局对象的self 属性基本上返回this(可能不是字面意义上的,而是概念上的)。所以,window.selfreturns windowself 在 Web Worker 中返回 Worker 的全局对象(不管它叫什么)。
【解决方案2】:

根据@buley 提示,我做到了:

var window = self;

importScripts(/* dependencies here */);

/* my code */

就我而言,我尝试使用 ES6-Promise 库:https://github.com/jakearchibald/es6-promise#readme

【讨论】:

  • 这个“提示”有点冒险。出于某些不同的目的(共享代码),我正在使用测试typeof window !== 'undefined' 来检查我是在网络工作者中还是在主客户端中JavaScript。它不再起作用了。
  • @allezl'OM 检查 window.document 可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2013-10-06
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多