SSE与刷新js命令
SSE vs flushing js commands?
signalR的后备方案之一是SSE-服务器发送的事件。它所做的就是通过这个结构发送一条消息:
Message'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的优势是什么
与JSONP/long轮询相比,服务器发送事件(SSE(的最大优势在于,您可以在收到SSE响应的每个块后立即读取该块,而无需完成响应。
您可以使用分块响应来发回JSONP负载,但负责加载JSONP有效负载的<script src="...
标记在整个响应完成之前不会执行JavaScript。在实践中,这意味着无论何时使用JSONP向客户端发送消息,都必须完成响应,以便客户端可以立即读取消息。
这反过来意味着客户端必须为接收到的每个消息发出一个新的JSONP请求(即向文档添加一个新脚本标记(。这就是为什么JSONP被认为是一个长轮询传输。
现在,正如您在一条评论中提到的,您可以使用iframe而不是脚本标记来加载JavaScript负载。如果这样做,可以发回分块响应,并在响应完成之前执行JavaScript,就像SSE一样。
事实上,这种隐藏的iframe技术正是SignalR用于其永久帧传输的技术。不幸的是,这种技术有几个缺点,导致SignalR在支持它的浏览器上更喜欢SSE:
-
隐藏iframe技术需要一个相对沉重的前奏*,因为您实际上是在发回HTML文档,而不是纯JavaScript。
-
除了函数调用之外,每个消息都需要封装在自己的脚本块中。(例如
<script>c({"message": "myMessage"})</script>
(。使用SSE,您只需要发送data: {"message": "myMessage"}'n'n
,这会稍微高效一些。 -
最后,也许也是最重要的一点,隐藏的iframe消耗的内存在从DOM中删除之前永远不会被清除。这意味着,如果你不想无限增长内存,你必须定期创建一个新的iframe并删除旧的iframe。SSE传输使用的EventSource对象可以无限期地保持打开状态,而不会泄漏内存。
*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>
- 命令行中的Uglify js;不要弄乱变量名
- 如何在没有单词的情况下从命令行运行Node.js程序'节点'
- 节点JS express和控制台输出到命令行与浏览器
- 如何将.json文件作为参数导入.js文件并使用命令行启动它
- 最小化CSS/JS文件,并使用命令行创建一个文件
- 如何在启动 Web 驱动程序实例之前通过命令行在 conf.js 中传递设备名称
- 使用 Node.js 执行命令行二进制文件
- 有没有一种方法可以在windows上使用Grunt.js调用gitshell中的命令
- commandr.js:通过action()传递命令的isDefault选项
- 命令行上的输入在什么时候解析为 node.js 中的 process.argv
- node.js命令行工具
- 尝试从命令行将android平台添加到ionic时,模块.js:341处出现错误
- Node js命令器args返回true而不是值
- 从命令行运行JS文件
- js表单验证中的docment.forms[“myForm”][“Element”].value命令
- 如何在命令提示符下运行js文件
- 用户扩展中的自定义命令.js启动 Selenium RC 时无法加载
- 如何启用命令js>shell
- 实现文本到命令(js到某些东西)的最佳方式
- 如何在节点中禁用“特殊命令”.js REPL