我正在学习KOA和Node.JS流。
我要做的是发送部分HTTP响应,并在片刻之后发送其余的响应。
app.get("/", function*(next) {
// TEST:
function delay(ms) {
return function(callback) {
setTimeout(callback, ms);
}
}
this.type = "text/plain";
var Readable = require("stream").Readable;
var stream = this.body = new Readable();
stream._read = function () {};
stream.push('First line.\n');
yield delay(2000);
stream.push('Last line.\n');
stream.push(null);
console.log("done");
});
我希望在浏览器中加载页面时,“第一行”。立即显示,2秒后也显示“第二行”。相反,似乎响应是作为一个整体发送的。
我在这里缺少什么?
最后,我将内部生成的日志数据流式传输到浏览器的长期连接中。
节点0.11.3,Koa 0.10.0
答案 0 :(得分:0)
稍后使用管道传输流,您没有机会刷新功能内的数据 检查代码:
var koa = require('koa')
var Readable = require('stream').Readable
var app = koa()
app.use(function*(next){
this.type = 'text/plain'
var stream = this.body = new Readable()
stream._read = function () {}
// isn't piped
console.log(stream._readableState.pipes != null)
yield function (callback) { setTimeout(callback, 2000) }
// not yet
console.log(stream._readableState.pipes != null)
var i = 0
setTimeout(function f(){
if (i == 0)
// now it is
console.log(stream._readableState.pipes != null)
stream.push(Date() + '\n');
if (++i < 200)
setTimeout(f, 50)
else
stream.push(null)
}, 100)
})
app.listen(80)
现在,我对koa不太熟悉,因此可能存在另一种解决方案。