首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventSource:总是出错

EventSource:总是出错
EN

Stack Overflow用户
提问于 2018-03-23 10:43:12
回答 1查看 3.5K关注 0票数 6

为了开始使用EventSource API,我编写了一个最具学术性的示例。问题是我总是出错,我找不到任何有用的信息。当我加载home.html时,JS脚本在source.onerror上停止;我将它打印到控制台中,但是分析对象时,我找不到任何错误类型或消息,因此我不知道它的错误所在。代码中有错误吗?可能是与服务器相关的错误?

home.html

代码语言:javascript
复制
<body>
  <div id="result"></div>
  <script src="sse.js"></script>
</body>

sse.js

代码语言:javascript
复制
function isSseEnabled() {
    return (typeof EventSource !== "undefined");
}

if (isSseEnabled()) {
    var source = new EventSource('source.php');
    source.onerror = function(e) {
        console.log(e);
        source.close();
    };
    source.onmessage = function (e) {
        console.log(e.data);
        document.getElementById('result').innerHTML += e.data.concat('<br>');
    }
} else {
    throw 'SSE not enabled';
}

source.php

代码语言:javascript
复制
<?php
header('Content-Type: text/event-stream');
header('Cache-control: no-cache');

$time = date('r');
echo "Time: $time";
flush();
EN

回答 1

Stack Overflow用户

发布于 2018-03-26 08:16:54

(TLDR:您没有使用SSE协议--请参阅此答案的后半部分。)

您需要做的第一件事是得到一条正确的错误消息,或者至少查看您的脚本正在生成的内容。我建议用卷发来测试你的剧本。从命令行:

代码语言:javascript
复制
curl http://127.0.0.1/source.php

(我假设您的html和source.php都在本地机器上,而不是使用https;如果没有,请调整上面的内容。同时调整以将路径添加到source.php。)

如果这是可行的,或者您没有卷发可用,请查看您的浏览器中的开发工具。查看与source.php的连接发生了什么,发送了什么,接收了什么。

但是,确实有几种改进PHP脚本的方法。首先,在消息前面加上"data:“,并在每个消息之后添加一对LFs;这是SSE协议所必需的。

其次,使用一个包含睡眠的无限循环(没有必要让SSE脚本返回一件事并关闭--在这种情况下,您最好只使用AJAX )。所以看起来是这样:

代码语言:javascript
复制
<?php
header('Content-Type: text/event-stream');
header('Cache-control: no-cache');

while(true){
    $time = date('r');
    echo "data:Time: $time\n\n";
    @ob_flush();flush();
    sleep(1);
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49447838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档