【问题标题】:How can access websockets in webworkers?如何在 webworkers 中访问 websockets?
【发布时间】:2012-08-08 05:42:57
【问题描述】:

我需要从 webworkers 发送 websocket 调用,我怎样才能得到它。我不认为用户代理有任何支持。如果有支持,请给我一个例子。

我正在尝试的示例。

var ws = new WebSocket(url);
var worker=new Worker(worker.js);

ws.onmessage=function(e){
worker.postMessage({ws:ws,data:e.data});
}

worker.js

onmessage=function(e){
  var ws=e.data.ws;
  var data=e.data.data;
  var request=someProcess(data);

  ws.send(request);
}

【问题讨论】:

  • 当我尝试这样做时得到 DOM 异常。
  • worker.postMessage 返回错误。

标签: javascript html websocket web-worker fileapi


【解决方案1】:

在 worker 中 ws 是一个 string 反序列化的 JSON 对象,而不是 WebSocket 对象。您不能将带有方法的对象传递给工作人员,这意味着工作人员需要回复主线程,而主线程执行ws.send(worker_response)

我怀疑您收到的错误是 DATA_CLONE_ERR 异常或类似情况,因为 WebSocket 对象不能通过 structured clone algorithm 进行 JSON 序列化。

【讨论】:

  • 来自这个讨论(stackoverflow.com/questions/10886910/…)。我收到评论“您可以通过 Chrome 中的 Web Workers 使用 WebSockets,并且有一个 Mozilla 错误来在 Firefox 中实现对此的支持:bugzilla.mozilla.org/show_bug.cgi?id=504553 – kanaka”。然后说can,t we send requests from worker to websockets.
  • 我同意你的观点,但我怀疑是否真的可以发送请求
  • 这与您是否可以在工作人员中使用 websocket 无关。我的意思是对象e.data.ws不是websocket 对象,因此没有send() 方法。那么e.data.ws 是什么?它是一个反序列化的 JSON 对象,它是从 WebSocket 对象创建的,但根据 JSON 数据@developer.mozilla.org/en-US/docs/DOM/Using_web_workers 下的注释不包含任何函数。具体来说:“传入和传出 worker 的对象不得包含函数或循环引用,因为 JSON 不支持这些。”
  • 你不能把整个websocket 只保留在webworker 中吗?然后将websocket 操作(聊天,随便)作为json 传递回jQuery?这可能吗?
  • 更新:2015 年 5 月 12 日 Firefox 38 允许在 Web Worker 中使用 WebSocket。
猜你喜欢
  • 2018-10-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多