使用生成器和迭代器管理流的正确模式是什么
What is the correct pattern with generators and iterators for managing a stream
我正试图弄清楚如何使用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"函数中解决,但它解决了我的主要问题,即模式应该如何工作。
相关文章:
- 不确定我在PHP AJAX中使用的是什么开发模式
- 将JavaScript检测与MVC4显示模式集成的最佳方式是什么
- 在Backbone.js'上设置属性的模式是什么;模型和视图
- 使用 ES6 模块而不是显示模块模式的额外优势是什么?
- 在 Node.js 中表示状态的普遍接受模式是什么?
- 在vimperator中手动切换到“提示”模式的命令是什么
- 从嵌套数组中获取唯一元素的 JS 模式是什么
- 它是什么类型的Javascript模式
- 创建新模型的正确控制器/视图模式是什么
- 模块模式内的回调函数中的“this”指的是什么
- firefox安全模式的作用是什么
- 在javascript中拆分字符串的正确模式是什么,只留下a-z个单词
- 最好的1-1聊天模式是什么?(AJAX/CI/JQ)
- 为什么在严格模式下不允许使用八进制数字文字(解决方法是什么?)
- 使用生成器和迭代器管理流的正确模式是什么
- 这两种JavaScript模式的优缺点是什么
- 什么'声明和获取js对象的最佳方式是什么?(模式)
- 使用这种JavaScript编码模式来定义构造函数的优点是什么
- 在使用 Jasmine 进行单元测试时,javascript 揭示模块模式的缺点是什么?
- 这段代码在Javascript中是什么设计模式