如何停止服务器发送的事件

ous*_*mal 6 javascript php

您好,我有一个 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 中将其设置isOpentrue第一次。首先检查标志并关闭连接(如果为真)。这种方式不需要服务器端的更改。

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)


Joh*_*ths 4

嗨,我已经添加了额外的内容(希望解决这个问题),您必须从服务器传递一条消息来关闭连接。否则,当执行完成时,浏览器将使用新连接启动

航空代码

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)

  • 无需发送“数据:END-IF-STREAM”。只需发送一个事件,例如“event: close”并使用 sse.addEventListener('close', fucntion(){ sse.close(); }); 监听该事件 (4认同)