9
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>

我究竟做错了什么 ?

4

3 回答 3

14

下面的一段代码打开一个与客户端的响应流并将其流式传输到客户端。因此,在 curl 中,您将首先获得“Hello”,然后在 2 秒后获得“World”(因为您设置了 2000 毫秒的间隔)。

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

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

这完全是浏览器的行为。在收到整个响应之前,它不会使用响应流。一旦流关闭,整个响应就可以使用了。但是,如果需要,在 PHP 中有一种方法可以刷新响应流。

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

我希望这就是你要找的。

于 2013-11-12T12:24:40.633 回答
8
// simulate delay response
app.use((req, res, next) => {
    setTimeout(() => next(), 2000);
});
于 2017-10-27T13:24:14.547 回答
4

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

于 2013-11-12T12:35:18.507 回答