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

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

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

我认为写入该流的实际软件是一个生成器函数,当准备接受另一个请求时会产生该函数,而我提供的允许外部人员调用该流的函数是一个插入器,但是我可能拥有这个错误的方法。

所以像这样

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运算符返回可以在“ runGenerator”函数中解决的诺言来解决,但这解决了我的主要问题,即模式应该如何工作。

关于javascript - 生成器和迭代器用于管理流的正确模式是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34234399/

10-10 19:37