为什么 dart:html WebSockets 中有 onOpen 和 onClose 流(不是 Futures)?
Why are onOpen and onClose Streams (not Futures) in dart:html WebSockets?
一个dart:html.WebSocket
打开一次,关闭一次。所以我希望 onOpen
和 onClose
属性是 Futures,但实际上它们是 Streams。
当然,我可以用stream.onClose.first
得到一个Future。但是 dart:io
版本 WebSocket 上的 done
属性 是预期的 Future,所以我想知道我是否遗漏了什么。
为什么在 dart:html
中使用 Streams 而不是 Futures?
一句话:透明度。 dart:html
包的目的是提供对页面 DOM 的访问,因此它尽可能接近地反映底层的 DOM 结构。这与 dart:io
形成对比,后者的目标是提供方便的服务器端 API 而不是暴露一些底层。
当然,作为 API 的消费者,您会期望 open
和 close
只被触发一次,而 message
会被触发多次,但是从根本上说,open
、close
、message
和 error
是 all 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 的消费者决定他们需要处理哪些情况以及可以忽略哪些情况。
一个dart:html.WebSocket
打开一次,关闭一次。所以我希望 onOpen
和 onClose
属性是 Futures,但实际上它们是 Streams。
当然,我可以用stream.onClose.first
得到一个Future。但是 dart:io
版本 WebSocket 上的 done
属性 是预期的 Future,所以我想知道我是否遗漏了什么。
为什么在 dart:html
中使用 Streams 而不是 Futures?
一句话:透明度。 dart:html
包的目的是提供对页面 DOM 的访问,因此它尽可能接近地反映底层的 DOM 结构。这与 dart:io
形成对比,后者的目标是提供方便的服务器端 API 而不是暴露一些底层。
当然,作为 API 的消费者,您会期望 open
和 close
只被触发一次,而 message
会被触发多次,但是从根本上说,open
、close
、message
和 error
是 all 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 的消费者决定他们需要处理哪些情况以及可以忽略哪些情况。