在生成器函数中产生流

时间:2016-04-27 13:25:55

标签: ecmascript-6 generator q es6-promise

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

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);
  });
});

它可以工作但是一旦我开始处理很多流,代码变得非常难看。这可以像下面的片段一样简单吗?。

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

1 个答案:

答案 0 :(得分:0)

您不需要将大部分代码放在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);
  });
}