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

标签 javascript node.js generator ecmascript-6

我试图弄清楚如何安排一对例程来控制使用 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”中解决的 promise 来解决这些问题"函数,但它解决了我的主要问题,即模式应该如何工作。

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

相关文章:

python 迭代器、生成器以及介于两者之间的

javascript - 如果我使用 Javascript 将 <option> 设置为选中,是否会触发更改事件?

javascript - JavaScript 中的 Node js/MongoDB 副本集数组

javascript - 在 &lt;script&gt; block 中转义 JavaScript 字符串文字中的 HTML 实体

json - 无法从curl访问JSON值

node.js - 在 Dialogflow 中存储用户位置首选项

python-2.7 - 合并生成器对象以计算 NLTK 中的频率

python - 停止递归生成器和排列

javascript - 在不同系统之间比较 JavaScript 的 getTime() 是否安全?

javascript - PHP - 从服务器端调用 javascript