gpt4 book ai didi

javascript - 如何正确实现 nodejs Stream API?

转载 作者:搜寻专家 更新时间:2023-11-01 00:34:23 25 4
gpt4 key购买 nike

我有一段应用程序有时从文件读取输入,有时通过套接字读取输入,有时从生成缓冲区或字符串的同一程序的另一部分读取输入。

作为数据源的套接字和文件都可以用 Node 的 Stream API 处理,我一直在尝试为缓冲区和字符串想出某种包装器来模仿它;我不想编写两个版本的“消费者”代码来处理作为输入的字符串,当数据已经在内存中时,我不想将它写入磁盘并再次读回。

大多数事情似乎工作得很好,但有些东西破坏了我对“管道”的实现:

MemoryStream.prototype = new process.EventEmitter;

MemoryStream.prototype.pipe = function(dest,opts){
var that=this;
function pipe_mem(data){
if(!dest.write(data)){
that.pause();
dest.once('drain',function(){
if(pipe_mem(data)){that.resume();}
});
return false;
}
return true;
}
this.on('data',pipe_mem);
if(!opts || opts.end){this.on('end',dest.end);}
this.resume();
};

MemoryStream.prototype.resume = function(){
var i,l,encoder;
if(this.active) return;
this.active = true;
l = this.buffer.length-1;
if(l>=0){
encoder = this.encoding?emit_string:emit_buffer;
for(i=0;i<l;i++){encoder(this,this.buffer[i],this.encoding);}
if(this.buffer[i]===''){
this.emit('end');
this.destroy();
}else{encoder(this,this.buffer[i],encoding);}
this.buffer = [];
}
};

每当我调用'pipe'时,我都会得到这个奇怪的错误:

TypeError: Object #<EventEmitter> has no method '_implicitHeader'
at EventEmitter.<anonymous> (http.js:651:10)
at EventEmitter.emit (events.js:61:17)
at EventEmitter.resume (/MemoryStream.js:36:9)

/MemoryStream.js 第 36 行是 this.emit('end');

知道发生了什么事吗?我该如何解决这个问题,或者是否有更好的方法来做我想做的事?

最佳答案

答案是:某处你这样称呼:

var end = response.end; response.end = function() { end() }

而不是这样的:

var end = response.end; response.end = function() { response.end = end; response.end() }

你看到了吗?上下文不同:在第一种情况下你用'this === global'调用它,但是没有global._implicitHeader函数,在第二种情况下你用'this === response'调用它,并且有response._implicitHeader 函数。

关于javascript - 如何正确实现 nodejs Stream API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6963873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com