生成器和迭代器用于pipe理stream的正确模式是什么?

我想弄清楚如何安排一对例程来控制使用ES2015中的生成器/迭代器函数写入stream。 它是一个简单的用于nodejs的日志logging系统

我想实现的是一个外部进程可以调用来写入日志的函数。我希望新的生成器/迭代器函数意味着如果需要挂起/在这个透明的例程中。

stream.write通常应该立即返回,但可以返回false来表示stream已满。 在这种情况下,它需要等待stream.on('drain',cb)才能返回

我正在考虑写入stream的实际软件是一个生成器函数,当它准备好接受另一个请求时产生,而我提供的允许外部人员调用stream的函数是一个interator,但是我可能会这样做错误的方式。

所以,这样的事情

var stopLogger = false; var it = writer(); function writeLog(line) { it.next(line); }) function *writer() { while (!stopLogger) { line = yield; if(!stream.write) { yield *WaitDrain(); //can't continue until we get drain } } }); function *waitDrain() { //Not sure what do do here to avoid waiting stream.on('drain', () => {/*do I yield here or something*/}); 

我在这里find了答案https://davidwalsh.name/async-generators

我有它倒退。

上面的代码应该是

 var stopLogger = false; function *writeLog(line) { yield writer(line) }) var it = writeLog(); function writer(line) { if (stopLogger) { setTimeout(()=>{it.next();},1};//needed so can get to yield } else { if(stream.write(line)) { setTimeout(()=>{it.next();},1}; //needed so can get to yeild } } } stream.on('drain', () => { it.next(); } 

我还没有完全尝试过这个,只是从上面的文章中翻译过来的,并且在错误等方面还存在一些复杂性,文章认为可以通过增强it运算符来返回一个可以在“runGenerator”函数中parsing的promise,但它解决了我的主要问题,这是模式如何工作。