gpt4 book ai didi

javascript - SSE 与刷新 js 命令?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:34:46 25 4
gpt4 key购买 nike

signalR 的后备之一是 SSE - 服务器发送的事件。它所做的就是通过这个结构发送消息:

消息\n\n

所以在服务器端:

Response.ContentType = "text/event-stream";

while (startDate.AddMinutes(1) > DateTime.Now)
{
Response.Write(string.Format("data: {0}\n\n", DateTime.Now.ToString()));
Response.Flush();

System.Threading.Thread.Sleep(1000);
}

很好。

但不是很好。

我可以轻松地将 JS 命令与数据一起使用(就像 jsonp 一样:填充回调对象类比)例如:_cb(myMessage)

在客户端 - 以相同的方式处理它。(甚至使用更受欢迎的 mime 类型,如 application/javascript)

我可能在这里遗漏了一些东西。

  • SSE 的优势是什么?

最佳答案

Server-sent events (SSE)的最大优势|与 JSONP/长轮询相比,您可以在收到 block 后立即读取 SSE 响应的每个 block ,而无需完成响应。

您可以使用分块响应发回 JSONP 负载,但是 <script src="...负责加载 JSONP 有效负载的标记在整个响应完成之前不会执行 JavaScript。实际上,这意味着您必须在使用 JSONP 向客户端发送消息时完成响应,以便客户端可以立即读取消息。

这反过来意味着客户端必须为它收到的每条消息发出一个新的 JSONP 请求(即向文档添加一个新的脚本标签)。这就是 JSONP 被认为是长轮询传输的原因。

现在,正如您在其中一条评论中提到的,您可以使用 iframe 而不是脚本标记来加载 JavaScript 负载。如果这样做,您可以发回分块响应并让 JavaScript 在响应完成之前执行,就像使用 SSE 一样。

其实这个hidden iframe这正是 SignalR 在其永久帧传输中使用的技术。不幸的是,这种技术有几个缺点导致 SignalR 在支持它的浏览器上更喜欢 SSE:

  1. 隐藏的 iframe 技术需要相对繁重的前奏*,因为您实际上是在发回 HTML 文档而不是纯 JavaScript。

  2. 除了函数调用之外,每条消息都需要包装在自己的脚本 block 中。 (例如 <script>c({"message": "myMessage"})</script> )。使用 SSE,您只需发送 data: {"message": "myMessage"}\n\n效率稍微高一些。

  3. 最后,或许也是最重要的一点是,隐藏的 iframe 消耗的内存在从 DOM 中移除之前永远不会被清除。这意味着,如果您不希望内存无限增长,则必须定期创建一个新的 iframe 并删除旧的。 EventSource object SSE 传输使用的可以无限期保持打开状态而不会泄漏内存。

* SignalR 的永远帧序曲:

<!DOCTYPE html><html><head><title>SignalR Forever Frame Transport Stream</title>
<script>
var $ = window.parent.jQuery,
ff = $ ? $.signalR.transports.foreverFrame : null,
c = ff ? ff.getConnection('1') : null,
r = ff ? ff.receive : function() {};
ff ? ff.started(c) : '';</script></head><body>

关于javascript - SSE 与刷新 js 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385069/

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