为什么在dart:html WebSockets中使用onOpen和onClose Streams(而不是Futures)?

时间:2015-02-09 21:27:16

标签: dart dart-html

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

当然,我可以使用stream.onClose.first来获得未来。但是done WebSocketdart:iodart:html属性是预期的未来,所以我想知道我是否遗漏了某些东西。

为什么在{{1}}中使用Streams而不是Futures?

1 个答案:

答案 0 :(得分:4)

总之:透明度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对象在这种情况下会如何表现?当然,我非常高兴,高度怀疑这将在“现实世界”中浮现出来。但DOM允许它,dart:html不应该做出判断调用,试图确定哪些情况可能,哪些情况不可能。如果根据规范可行,dart:html应该反映出来。它的作用只是简单地传递行为 - 尽可能透明 - 并让API的消费者决定他们需要处理哪些案例以及他们可以忽略哪些案例。