首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据传输到尚未准备好接收数据的可写流

将数据传输到尚未准备好接收数据的可写流
EN

Stack Overflow用户
提问于 2016-04-12 06:11:51
回答 1查看 1.5K关注 0票数 8

是否有一种方法可以将可读流连接到Node.js中的可写流,此时可写流还没有准备好接收数据?换句话说,我想将可读性和可写性连接起来,但是我想在程序的稍后阶段初始化写方法,包括定义写方法。也许我们必须实现写方法,但是是否有一种方法可以以类似的方式暂停可写流,从而暂停可读流?或者,我们可以使用中间通过/转换流并在那里缓冲数据,然后再将数据传输到可写程序!

例如,我们通常这样做:

代码语言:javascript
运行
复制
readable.pipe(transform).pipe(writable);

但我想做这样的事:

代码语言:javascript
运行
复制
const tstrm = readable.pipe(transform);

doSomethingAsync().then(function(){

      tstrm.pipe(writable);

});

只是想知道这是否有可能,以及如何正确地做到这一点,到目前为止,这两者都很难解决。

我想我希望在中间转换流中缓冲数据,在数据连接/管道到可写流之前,然后,一旦数据连接,就先将缓冲的数据流到任何新数据之前。似乎是一件合理的事,却找不到任何关于这方面的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-20 20:03:05

注意,我在这里使用一个间隔来模拟作者是否能够阅读。你可以用任何你想要的方式(如果作者返回false,你会更新状态以开始缓冲等等)。我认为最后一行是你想要的

代码语言:javascript
运行
复制
r.pipe(b).pipe(w);

这是如下所示

代码语言:javascript
运行
复制
readStrem.pipe(transformBbuffer).pipe(writeStream);

在示例代码中,我们可以进行一些更改来缓冲所有数据。我会在代码之后描述。您需要了解的所有关于流的信息都在文档中,我认为它们可以用更完整的示例来完成,但是它们非常好.

1

这是密码。

代码语言:javascript
运行
复制
var fs     = require('fs');
var stream = require('stream')
const util = require('util');
//const StringDecoder = require('string_decoder').StringDecoder;
const Transform = require('stream').Transform;
var check_buff  = 0;
var DRAIN_ME    = 0;

var r = fs.createReadStream('file1.txt').setEncoding('utf8');
var w = fs.createWriteStream('file2.txt');

var BufferStream = function () {
  stream.Transform.apply(this, arguments);
  this.buffer = []; 
};

util.inherits(BufferStream, stream.Transform);

var intId;
intId = setInterval(function(){
  if(check_buff % 3 == 0) {
    DRAIN_ME = 1;
    return;
  }
  DRAIN_ME = 0;
},10);  

BufferStream.prototype._transform = function (chunk, encoding, done) {
  this.buffer.push(String(chunk));
  while(DRAIN_ME > 0 && this.buffer.length > 0) {
    this.push(this.buffer.shift());
  }
  console.log(chunk.length);
  console.log(this.buffer.length);
  done();
};

var b = new BufferStream();
b.on('end', function(chunk) {
  clearInterval(intId);
});
r.pipe(b).pipe(w);

我正在寻找一种规范的方法来实现转换/贯穿流,它缓冲所有数据直到管道调用它。

进行以下更改

代码语言:javascript
运行
复制
BufferStream.prototype._transform = function (chunk, encoding, done) {
  this.buffer.push(String(chunk));

  console.log(chunk.length);
  console.log(this.buffer.length);
  done();
};
......
BufferStream.prototype._flush = function (cb) {
  var len = this.buffer.length;
  for (var i = 0; i < len; i++) {
    this.push(this.buffer.shift());
  };
  cb();
};

您也可以暂停可读流,这实际上会暂停可写流,因为它停止接收数据,即.

要测试这一点,请在磁盘上创建一个相当大的文件,即100 or或更多,然后运行以下命令.

代码语言:javascript
运行
复制
var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');

readableStream.setEncoding('utf8');

readableStream.on('data', function(chunk) {
  var ready = 0;
  readableStream.pause();
  setInterval(function(){
    if(ready == 0) {
      //console.log('pausing');
      readableStream.pause();
      ready = 1;
    }   
    else {
      //console.log('resuming');
      readableStream.resume();
      ready = 0;
    }   
  },100);  
  writableStream.write(chunk);
});

立即暂停的原因是,当间隔触发10ms时,文件可能已经写入。这个有变化的.

代码语言:javascript
运行
复制
var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');
readableStream.setEncoding('utf8');

var ready = 0;
setInterval(function(){
  if(ready == 0) {
    //console.log('pausing');
    readableStream.pause();
    ready = 1;
  }
  else {
    //console.log('resuming');
    readableStream.resume();
    ready = 0;
  }
},100);  

readableStream.on('data', function(chunk) {
  writableStream.write(chunk);
  readableStream.pause();
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36564892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档