【问题标题】:websocket and Isolate.spawnuriwebsocket 和 Isolate.spawnuri
【发布时间】:2026-02-11 06:35:01
【问题描述】:

是否可以在使用 Isolate.spawnuri 创建的 Dart 隔离中使用 websockets 形式?

我的理解是,客户端,Isolate.spawnuri 使用 WebWorkers,而 WebWorker 不能使用dart:html (DOM),但是,客户端,websockets 是dart:html 的一部分。所以这是不行的吗?

谢谢

(很难测试,在尝试使用 Dart 编辑器执行此操作时,我没有收到任何错误或信息,生成的隔离是不可见的,也没有抛出任何可见的错误,它只是挂起)

这里有一些代码来测试这个:https://gist.github.com/kgersen/148460d056f498a849ef

【问题讨论】:

  • 您的隔离似乎挂起,因为您没有捕获实例化 WebSocket 时抛出的对象。您必须在隔离的 main() 中捕获所有抛出的对象,否则隔离将暂停或终止。如果您想查看错误信息,您必须通过 SendPort 将其发送回主隔离。我的测试表明,在 spawnuri 创建的隔离中使用某些类会导致抛出 UnimplementedError,但如果包括实例化 WebSocket 的 DOM 抛出字符串(SDK 1.6),则使用。
  • 是的,添加一个问题:此隔离中未启用 DOM 访问

标签: dart websocket dart-isolates


【解决方案1】:

这项工作正在进行中。这将是一个isolate.spawnDomXxxx,它允许导入dart:html。见http://dartbug.com/3050

【讨论】:

  • 是的,但它自 2012 年以来处于“分类”状态。这真的是 WIP 吗?
  • 很长一段时间以来,分离物没有太大进展,但根据我的经验,最近几个月分离物取得了良好进展(监控 dartbug.com 更新)。对隔离断点的支持是最近才实现的,处理错误的不同方法,关于终止隔离的通知,...
  • tx 我会留意那个。
  • 第二个想法,为什么 WebSocket 在 dart:html 中而不是拥有自己的包(例如 dart:websocket)?
  • 在浏览器中,您只有浏览器 API 提供的可用功能。 dart:html 只是这个 API 的一个抽象,此外还试图提供一个统一的 API,其中隐藏了浏览器的差异。