gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:37:23 27 4
gpt4 key购买 nike

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

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

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

最佳答案

一句话:透明度dart:html 包的目的是提供对页面 DOM 的访问,因此它尽可能接近地反射(reflect)底层 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 应该反射(reflect)这一点。它的作用只是尽可能透明地传递行为,并让 API 的使用者决定他们需要处理哪些情况以及可以忽略哪些情况。

关于dart - 为什么 dart :html WebSockets? 中的 onOpen 和 onClose 流(不是 Futures),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28419716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com