Javascript 我可以使用jquery和AJAX调用CGIBIN脚本,然后添加消息事件来处理服务器发送的事件吗?
我有一个长时间运行的CGIBIN程序(运行3-15分钟),我想使用AJAX调用它。在它运行时,我希望从它接收服务器发送的事件数据,并将其显示在我的网页上。有点像进度监视器,但更像是一个聊天窗口,在脚本运行时自动更新 下面是我如何调用脚本的:Javascript 我可以使用jquery和AJAX调用CGIBIN脚本,然后添加消息事件来处理服务器发送的事件吗?,javascript,jquery,ajax,server-sent-events,Javascript,Jquery,Ajax,Server Sent Events,我有一个长时间运行的CGIBIN程序(运行3-15分钟),我想使用AJAX调用它。在它运行时,我希望从它接收服务器发送的事件数据,并将其显示在我的网页上。有点像进度监视器,但更像是一个聊天窗口,在脚本运行时自动更新 下面是我如何调用脚本的: 变量参数=[];//包含值的大型数组。。。未显示。 $.ajax({ 类型:“POST”, url:'cgi-bin/datagen.cgi', 数据:{id::1,“params”:params}, 数据类型:“json”, 成功:函数(db){cons
变量参数=[];//包含值的大型数组。。。未显示。
$.ajax({
类型:“POST”,
url:'cgi-bin/datagen.cgi',
数据:{id::1,“params”:params},
数据类型:“json”,
成功:函数(db){console.log(“done”);}
});
我喜欢使用$.ajax(…
将大量json数据发布到脚本中,但是我看不到切换到服务器发送的事件消息以接收(侦听)返回数据的方法。
使用SSE而不是ajax,我看不到(也找不到示例)向脚本中发布大量数据
我也不能使用WebSocket,所以SSE是我唯一的选择
-AC不幸的是,SSE不支持POST数据。这是标准中令人恼火的疏忽;特别是考虑到浏览器通常只是将
EventSource
作为XMLHttpRequest
的变体来实现,后者已经允许POST
一个(混乱的)选项是让cgi将其进度写入日志文件,然后编写一个SSE服务器脚本轮询该日志文件。服务器将打开两个套接字,一个用于ajax调用,一个用于SSE.Yuk
更好的选择是使用长轮询(也称为comet)方法。您需要直接使用XMLHttpRequest
对象,而不是jQuery的$.ajax()
,但它并没有那么糟糕。优点是(在大多数浏览器上)您可以免费获得想要做的事情,因为您的xhr对象具有onreadystatechange()
调用了后端脚本正在发送的所有进度信息。您可以通过查看xhr来区分进度信息和最终结果之间的差异。readyState
:3表示正在进行,4表示完成
查看HTML5数据推送应用程序与SSE(O'Reilly)的第7章以获得更多解释(免责声明:我的书),否则你会在web上找到大量信息。第9章,关于身份验证,是我抱怨SSE中缺乏POST支持的地方,并展示了如何将变通方法添加到先前章节中构建的应用程序中