【问题标题】:Yielding streams in generator functions在生成器函数中产生流
【发布时间】:2016-08-21 19:58:53
【问题描述】:

我最近开始使用Q.spawn 函数来运行产生承诺的生成器。这在尚未支持流的浏览器中运行良好,但在节点的情况下我们有流。如果您在生成器函数中使用流,并且希望在编写器流完成后产生,那么您的代码就变得不那么干净了。

Q.spawn(function* () {
  yield new Promise(resolve => {
    let fromStream = fs.createReadStream('x.txt');
    let toStream = fs.createWriteStream('y.txt');

    toStream.on('end', () => resolve());
    fromStream.pipe(toStream);
  });
});

它可以工作,但是一旦我开始处理大量流,代码就会变得非常难看。这可以像下面的sn-p一样简单吗?。

someGeneratorFuncRunner(function* () {
    yield fs.createReadStream('x.txt')
            .pipe(fs.createWriteStream('y.txt'));
});

【问题讨论】:

    标签: ecmascript-6 generator q es6-promise


    【解决方案1】:

    您不需要将大部分代码放入 Promise 构造函数中:

    Q.spawn(function* () {
      let fromStream = fs.createReadStream('x.txt');
      let toStream = fs.createWriteStream('y.txt');
    
      fromStream.pipe(toStream);
      yield new Promise(resolve => {
        toStream.on('end', resolve);
      });
    });
    

    当然,如果您正在等待大量流,则将 Promise 构造函数调用分解为辅助函数是有意义的:

    function endOf(stream) {
      return new Promise(resolve => {
        stream.on('end', resolve);
      });
    }
    

    【讨论】:

    • 好的,但我真正想知道的是是否可以产生一个流,然后运行器将流隐式转换为一个承诺。我面临的问题是someStream.pipe(outStream).on('end', => resolve()) 似乎无法解决承诺。我是 nodejs 流的新手。
    • 我认为 Q 在这方面不像 Bluebird 那样可扩展。您可以使用 then 方法扩展内置的 Stream.prototype 以使流可以使用,这应该允许它们成为 yielded,但我不确定这是否是一个好习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2016-01-09
    • 2012-06-27
    • 2020-04-23
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多