用于管理流的生成器和迭代器的正确模式是什么
What is the correct pattern with generators and iterators for managing a stream
我正在尝试找出如何安排一对例程来控制使用 ES2015 中的 generator/iterator 函数写入流。它是一个在 nodejs
中使用的简单日志系统
我想要实现的是一个函数,外部进程可以调用它来写入 log.I 我希望新的 generator/iterator 函数意味着如果它需要 suspend/inside这个套路就是透明的。
stream.write 通常应该立即 return,但可以 return false 表示流已满。在这种情况下,它需要等待 stream.on('drain',cb) 在 returning
之前触发
我认为写入流的实际软件是一个生成器函数,它在准备好接受另一个请求时产生,而我提供的允许外部人员调用流的函数是一个交互器,但我可能理解错了。
所以,像这样
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 运算符增强为 return 一个可以解决的承诺来解决在 "runGenerator" 函数中得到解决,但它解决了我的主要问题,即 模式 应该如何工作。
我正在尝试找出如何安排一对例程来控制使用 ES2015 中的 generator/iterator 函数写入流。它是一个在 nodejs
中使用的简单日志系统我想要实现的是一个函数,外部进程可以调用它来写入 log.I 我希望新的 generator/iterator 函数意味着如果它需要 suspend/inside这个套路就是透明的。
stream.write 通常应该立即 return,但可以 return false 表示流已满。在这种情况下,它需要等待 stream.on('drain',cb) 在 returning
之前触发我认为写入流的实际软件是一个生成器函数,它在准备好接受另一个请求时产生,而我提供的允许外部人员调用流的函数是一个交互器,但我可能理解错了。
所以,像这样
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 运算符增强为 return 一个可以解决的承诺来解决在 "runGenerator" 函数中得到解决,但它解决了我的主要问题,即 模式 应该如何工作。