我有以下简单的NodeJS代码:
var http = require("http");
http.createServer( function(request, response){
response.writeHead(200);
setTimeout(function(){
response.write("This printed 3 secs later, ait?");
response.end();
}, 3000);
response.write("This will be printed before.\n");
}).listen(8080);
如果我使用node scriptname.js
运行脚本,然后通过终端中的curl访问它,如下所示:
curl http://localhost:8080
我按预期获得输出,首先打印This will be printed before.
,然后在3秒后输出This printed 3 secs later, ait?
。
但是,当我在浏览器中打开http://localhost:8080
(最新版本的Chrome,Firefox)页面加载3秒钟时,它会同时打印文本This will be printed before.
This printed 3 secs later, ait?
。为什么会发生这种情况,我怎么能在浏览器中做出相同的行为呢?
编辑:正如Ken在回答中所述
...这仅仅是由于浏览器呈现引擎呈现内容的行为。渲染引擎将内容兑换为response.end();
并建议去看看Socket.IO,我想出了这个使用express和Socket.IO的工作示例:
// timeoutTest.js
var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);
server.listen(8080);
app.use(express.static(__dirname + '/'));
app.get('/', function (req, res) {
res.sendfile(__dirname + '/timeoutTest.html');
});
io.sockets.on('connection', function (client) {
client.emit('msg', "This prints right now on connection.");
setTimeout(function(){
client.emit('msg', "This prints out after 3 secs.");
}, 3000);
});
// timeoutTest.html
<!DOCTYPE html>
<html>
<head>
<script src="/socket.io/socket.io.js"></script>
<script src="jquery.js"></script>
<script>
$(document).ready(function(){
var server = io.connect('http://localhost');
server.on('msg', function(data){
$('body').append(data + "<br/>");
});
});
</script>
</head>
<body>
</body>
</html>
答案 0 :(得分:3)
我认为这仅仅是由于浏览器呈现引擎呈现内容的行为。
渲染引擎将内容兑换为内容
response.end();
到达,然后呈现整体。
基本上,浏览器中的HTML内容永远不会通过增量server push
自动更新,例如response.write
。
您必须通过Ajax和DHTML / js技术将pull
数据从服务器发送到浏览器客户端。
终端中的curl是完全不同的故事。
如果您在node
服务器和浏览器客户端之间寻求更多互动行为,如果您需要server push
功能,websocket
是可行的方法,还可以调查node stream
内容
Socket.IO
很有名,node stream
https://github.com/substack/stream-handbook对你来说应该很有趣。
我个人在我自己的项目中这样做:
http://kenokabe.github.io/MarkdownLive/
我使用Markdown写东西,需要一个流预览,所以我自己创建。预览屏幕是一个浏览器HTML页面,HTML内容以流方式递增地呈现和更新。