如何在setInterval(function(){...})中传递服务器已发送事件对象

时间:2019-03-27 11:31:17

标签: javascript setinterval server-sent-events

我想在一段时间后停止SSE,并且需要重新连接。

在JavaScript中使用setInterval(function(){})会导致错误:

source.close(); // <<-- ERROR : object is not defined

有人可以指导我寻求解决方案吗?

<script>

if(typeof(EventSource) !== "undefined"){

    var source = new EventSource("sse_server.php");

    // ReConnecting ST
    setInterval(function(){ 
        console.log("ReConnecting...");

        source.close(); // <<---------- ERROR : object is not defined

        var source = new EventSource("sse_server.php");
    }, 6000); 
    // ReConnecting EN

    source.addEventListener("response", function(event) {
         document.getElementById("result").innerHTML += "<p>" + event.data + "</p>";
    });

    source.addEventListener("message_status", function(event) {
         document.getElementById("result").innerHTML += "<p>" + event.data + "</p>";
    });

    source.onmessage = function(event) {

        var json = JSON.parse(event.data);

        if(json.category=="chat") {
            document.getElementById("result").innerHTML += "<p>"  + json.content.messageContent.messageText + "</p>";
        }else{
            document.getElementById("result").innerHTML += "<p>" + event.data + "</p>";
        } 

  };

} else {
  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}


</script> 

1 个答案:

答案 0 :(得分:1)

看看这个:

source.close(); // <<---------- ERROR : object is not defined
var source = new EventSource("sse_server.php");

您已在功能范围内定义了一个不同变量,且其名称相同。由于您要等到下一行才给它赋值,所以它是undefined

如果您要从函数内部的更广泛的范围访问source,请不要在函数内部的其他变量中重复使用该名称。

如果要覆盖更广泛的变量中的source,请从函数内的行中删除var,以便使用现有变量,而不必重新声明在本地范围内。