Javascript 我可以使用jquery和AJAX调用CGIBIN脚本,然后添加消息事件来处理服务器发送的事件吗?

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

我有一个长时间运行的CGIBIN程序(运行3-15分钟),我想使用AJAX调用它。在它运行时,我希望从它接收服务器发送的事件数据,并将其显示在我的网页上。有点像进度监视器,但更像是一个聊天窗口,在脚本运行时自动更新

下面是我如何调用脚本的:

变量参数=[];//包含值的大型数组。。。未显示。
$.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支持的地方,并展示了如何将变通方法添加到先前章节中构建的应用程序中