使用生成器和迭代器管理流的正确模式是什么

What is the correct pattern with generators and iterators for managing a stream

本文关键字:是什么 模式 管理 迭代器      更新时间:2023-09-26

我正试图弄清楚如何使用ES2015中的生成器/迭代器函数安排一对例程来控制对流的写入。这是一个在nodejs 中使用的简单日志系统

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

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

我认为,写入流的实际软件是一个生成器函数,当它准备好接受另一个请求时,它就会产生,而我提供的允许外部人员调用流的函数是一个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*/});

我在这里找到了答案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运算符来返回promise来解决错误等方面的一些复杂问题,该promise可以在"runGenerator"函数中解决,但它解决了我的主要问题,即模式应该如何工作。