var http = require('http');
var s = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello\n');
setInterval(function() {
res.end(' World\n');
},2000);
console.log("Hello");
});
s.listen(8080);
启动上述服务器后,我运行
curl http://127.0.0.1:8080
我得到了所需的延迟。输出:
Hello <2 seconds> World
但是在浏览器中,整个内容在2秒后加载。
Hell World <together after 2s>
我做错了什么?
答案 0 :(得分:9)
以下代码打开了客户端的响应流并将其流式传输到客户端。因此,在curl中,你将首先获得“Hello”,并在2秒后获得“World”(因为你设置了2000毫秒的间隔)。
res.write('Hello\n');
setInterval(function() {
res.end(' World\n');
},2000);
但浏览器只有在收到完整的响应流后才会呈现它。 这就是为什么你在2秒后收到回复的原因。
这完全是浏览器的行为。在收到整个响应之前,它不会使用响应流。一旦流关闭,整个响应将准备好被利用。但是,在PHP中,如果需要,有一种方法可以刷新响应流。
但是,如果您经常查找流数据,这不是最好的方法。我建议您使用Comet technique或websockets。
我希望这就是你要找的东西。
答案 1 :(得分:4)
浏览器行为与curl
不同。在您致电res.end()
之前,浏览器不会呈现该页面。因此,如果您想在延迟后加载网页的一部分,则需要通过websocket或ajax请求单独加载第二部分。我建议使用websocets。看一下socket.io,这是在node.js中使用websockets的一种简单方法。
答案 2 :(得分:2)
// simulate delay response
app.use((req, res, next) => {
setTimeout(() => next(), 2000);
});