【问题标题】:Why are onOpen and onClose Streams (not Futures) in dart:html WebSockets?为什么 dart:html WebSockets 中有 onOpen 和 onClose 流(不是期货)?
【发布时间】:2015-04-09 18:42:39
【问题描述】:

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

当然,我可以使用stream.onClose.first 来获得 Future。但是dart:io 版本的WebSocket 上的done 属性正如预期的那样是Future,所以我想知道我是否遗漏了什么。

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

【问题讨论】:

  • 只是一个猜测,但也许他们可以发送多个错误,Future 只能提供一个错误。
  • 可能是因为它们是 JavaScript DOM 中的事件,所以不存在一次性事件(现在我们在 JS 中也有 Promises/Futures!)。 Dart 代码由 DOM 定义生成,所有事件都被转换为流。

标签: dart dart-html


【解决方案1】:

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

当然,作为 API 的使用者,您希望 openclose 只被触发一次,而 message 会被触发多次,但从根本上来说,open、@987654328 @、messageerrorall just events。而在dart:html 中,DOM 事件被建模为流。

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

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 的使用者决定他们需要处理哪些情况以及可以忽略哪些情况。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 2010-09-09
    • 2012-02-16
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2021-12-24
    • 2018-06-12
    • 2014-09-11
    相关资源
    最近更新 更多