为什么 dart:html WebSockets 中有 onOpen 和 onClose 流(不是 Futures)?

Why are onOpen and onClose Streams (not Futures) in dart:html WebSockets?

一个dart:html.WebSocket打开一次,关闭一次。所以我希望 onOpenonClose 属性是 Futures,但实际上它们是 Streams。

当然,我可以用stream.onClose.first得到一个Future。但是 dart:io 版本 WebSocket 上的 done 属性 是预期的 Future,所以我想知道我是否遗漏了什么。

为什么在 dart:html 中使用 Streams 而不是 Futures?

一句话:透明度dart:html 包的目的是提供对页面 DOM 的访问,因此它尽可能接近地反映底层的 DOM 结构。这与 dart:io 形成对比,后者的目标是提供方便的服务器端 API 而不是暴露一些底层。

当然,作为 API 的消费者,您会期望 openclose 只被触发一次,而 message 会被触发多次,但是从根本上说,openclosemessageerrorall just events。在 dart:html 中,DOM 事件被建模为流。

实际上,WebSocket 可以 很好地触发多个打开事件(或关闭事件)。以下绝对是一个人为的例子,但请考虑 javascript:

的这个片段
var socket = new WebSocket('ws://mysite.com');
socket.dispatchEvent(new Event('open'));
socket.dispatchEvent(new Event('open'));
socket.dispatchEvent(new Event('open'));

如果 onOpen 是 Future 而不是 Stream,Dart WebSocket 对象在这种情况下会如何表现?当然,我非常,非常 怀疑这会在 "real world" 中浮出水面。但是 DOM 允许这样做,并且 dart:html 不应该做出判断,试图确定哪些情况可能发生,哪些情况可能发生。如果根据规范可能,dart:html 应该反映这一点。它的作用只是传递行为 - 尽可能透明 - 让 API 的消费者决定他们需要处理哪些情况以及可以忽略哪些情况。