dart:html.WebSocket
打开一次并关闭一次。所以我希望onOpen
和onClose
属性是Futures,但实际上它们是Streams。
当然,我可以使用stream.onClose.first
来获得未来。但是done
WebSocket版dart:io
版dart:html
属性是预期的未来,所以我想知道我是否遗漏了某些东西。
为什么在{{1}}中使用Streams而不是Futures?
答案 0 :(得分:4)
总之:透明度。 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对象在这种情况下会如何表现?当然,我非常高兴,高度怀疑这将在“现实世界”中浮现出来。但DOM允许它,dart:html
不应该做出判断调用,试图确定哪些情况可能,哪些情况不可能。如果根据规范可行,dart:html
应该反映出来。它的作用只是简单地传递行为 - 尽可能透明 - 并让API的消费者决定他们需要处理哪些案例以及他们可以忽略哪些案例。