您好,我有一个 javascript 代码,它通过服务器发送的事件侦听 PHP 代码,它运行良好,响应是通过循环从服务器发送的,当循环结束时,服务器发送的事件在脚本运行几秒钟后停止又在听了。当来自服务器端的循环也结束时,如何结束服务器发送的事件?谢谢。
JS:
var sse=new EventSource("data.php");
sse.onmessage=function(event){
document.getElementById("map").innerHTML+=event.data;
};
Run Code Online (Sandbox Code Playgroud)
PHP:
<?php
header('Content-Type: text/event-stream'); //indicates that server is aware of server sent events
header('Cache-Control: no-cache');//disable caching of response
$coordinates = [
[
"20:11",
33.5731235,
-7.6433045
],
[
"20:11",
33.5731054,
-7.6432876
],
[
"20:11",
33.5731644,
-7.6433304
]
];
foreach($coordinates as $c){
echo "data: ".json_encode($c)."\n\n";
ob_get_flush();
flush();
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
小智 5
isOpenOnce = false
您可以在 javascript 中使用布尔变量,然后在 sse.onopen 中将其设置isOpen
为true
第一次。首先检查标志并关闭连接(如果为真)。这种方式不需要服务器端的更改。
var isOpenOnce = false;
sse.onopen = function() {
if(isOpenOnce) {
sse.close();
}else {
console.log("Connection to server opened.");
isOpenOnce = true;
}
}
Run Code Online (Sandbox Code Playgroud)
嗨,我已经添加了额外的内容(希望解决这个问题),您必须从服务器传递一条消息来关闭连接。否则,当执行完成时,浏览器将使用新连接启动
航空代码
JS:
var sse=new EventSource("data.php");
sse.onmessage=function(event){
if ('END-OF-STREAM' == event.data) {
sse.close(); // stop retry
}
document.getElementById("map").innerHTML+=event.data;
};
Run Code Online (Sandbox Code Playgroud)
PHP:
<?php
header('Content-Type: text/event-stream'); //indicates that server is aware of server sent events
header('Cache-Control: no-cache');//disable caching of response
$coordinates = [
[
"20:11",
33.5731235,
-7.6433045
],
[
"20:11",
33.5731054,
-7.6432876
],
[
"20:11",
33.5731644,
-7.6433304
]
];
foreach($coordinates as $c){
echo "data: ".json_encode($c)."\n\n";
ob_get_flush();
flush();
sleep( rand ( 1 , 3 ) );
}
echo "data: END-OF-STREAM\n\n"; // Give browser a signal to stop re-opening connection
ob_get_flush();
flush();
sleep(1); // give browser enough time to close connection
Run Code Online (Sandbox Code Playgroud)