节点JS,延迟响应

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> 

我究竟做错了什么 ?

下面的一段代码将打开一个与客户端的响应stream并将其stream式传输到客户端。 所以,在curl中,你会在2秒后得到“Hello”和“World”(因为你已经设置了2000毫秒的时间间隔)。

  res.write('Hello\n'); setInterval(function() { res.end(' World\n'); },2000); 

但浏览器只有在收到完整的响应stream后才会渲染它。 这就是为什么你2秒后得到响应。

这完全是浏览器的行为。 在收到整个响应之前,它不使用响应stream。 一旦这个stream被closures,整个响应就可以被利用。 但是,在PHP中,如果需要,可以刷新响应stream。

但是,如果您正在频繁地查找stream数据,这不是最好的方法。 我宁愿build议你使用Comet技术或websockets 。

我希望这是你正在寻找的。

浏览器行为不同于curl 。 浏览器将不会呈现页面,直到您调用res.end() 。 所以如果你想延迟加载一个网页的一部分,你需要通过websocket或ajax请求单独加载第二部分。 我build议使用websocets。 看看socket.io ,这是在node.js中使用websockets的简单方法。

 // simulate delay response app.use((req, res, next) => { setTimeout(() => next(), 2000); });