节点JS,延迟响应

Jay*_*m R 5 node.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);
Run Code Online (Sandbox Code Playgroud)

启动上面的服务器后,我运行,

curl http://127.0.0.1:8080 
Run Code Online (Sandbox Code Playgroud)

我得到了所需的延迟.输出:

Hello <2 seconds> World
Run Code Online (Sandbox Code Playgroud)

但是在浏览器中,整个内容在2秒后加载.

Hell World <together after 2s>
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?

Ami*_*lgi 11

以下代码打开了客户端的响应流并将其流式传输到客户端.因此,在curl中,你将首先获得"Hello",并在2秒后获得"World"(因为你设置了2000毫秒的间隔).

      res.write('Hello\n');
      setInterval(function() {
          res.end(' World\n');
      },2000);
Run Code Online (Sandbox Code Playgroud)

但浏览器只有在收到完整的响应流后才会呈现它.这就是为什么你在2秒后收到回复的原因.

这完全是浏览器的行为.在收到整个响应之前,它不会使用响应流.一旦流关闭,整个响应将准备好被利用.但是,在PHP中,有一种方法可以在需要时刷新响应流.

但是,如果您经常查找流数据,这不是最好的方法.我宁愿建议你使用Comet技术websockets.

我希望这就是你要找的东西.


Uda*_*ale 8

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


Nas*_*ade 6

浏览器行为不同于curl. 浏览器不会渲染页面,直到您调用res.end(). 因此,如果您想在延迟后加载网页的一部分,则需要通过 websocketajax 请求单独加载第二部分。我建议使用 websocket。看看socket.io,这是在node.js中使用websockets的简单方法。