我最近开始使用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'));
});
答案 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);
});
}