Javascript 如何正确实现nodejs流API?

Javascript 如何正确实现nodejs流API?,javascript,node.js,stream,Javascript,Node.js,Stream,我有一个应用程序,它有时从文件读取输入,有时通过套接字读取输入,有时从同一程序的另一部分读取输入,该程序生成缓冲区或字符串 作为数据源的套接字和文件都可以通过节点的流API来处理,我一直在尝试为缓冲区和字符串设计某种包装器来模拟这一点;我不想只为了处理字符串作为输入而编写两个版本的“消费者”代码,当数据已经在内存中时,我不想将其写入磁盘并再次读取 大多数事情似乎都很好,但有些事情正在破坏我对“管道”的实现: MemoryStream.prototype = new process.EventEm

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

作为数据源的套接字和文件都可以通过节点的流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 = [];
    }
};
MemoryStream.prototype=newprocess.EventEmitter;
MemoryStream.prototype.pipe=函数(dest,opts){
var=这个;
功能管道_mem(数据){
如果(!目标写入(数据)){
暂停();
dest.once('drain',function(){
if(pipe_mem(data)){that.resume();}
});
返回false;
}
返回true;
}
本文件在(‘数据’,管道成员)上;
如果(!opts | | opts.end){this.on('end',dest.end);}
这个是resume();
};
MemoryStream.prototype.resume=函数(){
变量i,l,编码器;
如果(此.活动)返回;
this.active=true;
l=此.buffer.length-1;
如果(l>=0){
编码器=此。编码?发射字符串:发射缓冲区;

对于(i=0;i来说,答案是:在某个地方,你称之为这样的东西:

var end = response.end; response.end = function() { end() }
var end = response.end; response.end = function() { response.end = end; response.end() }
而不是像这样:

var end = response.end; response.end = function() { end() }
var end = response.end; response.end = function() { response.end = end; response.end() }
看到了吗? 上下文是不同的:在第一种情况下,您使用'this===global'调用它,但没有全局。_implicitHeader函数,在第二种情况下,您使用'this===response'调用它,并且有response。_implicitHeader函数