我们希望将来自生成器的流数据事件消耗到转换/转换管道中。
生成器的一种形式如下
var generator = async function* () {
var value
while(true){
value = await new Promise((resolve)=>{
value = ... // some functionality
resolve(value)
})
yield value
}
}
假设有一个正在产生值的数据流。有一个工厂函数可以使用处理函数
async function makeStream(handler) {
...
}
句柄函数将提供一个表示从流中生成的值的有效负载。
var handler = function(payload){
}
对于流,我们需要提供回调。对于生成器,我们需要在调用处理程序时解析承诺。我们希望能够编写如下代码:
function makeCallbackGenerator() {
var handler
var generator = async function*() {
while(true){
var value = await new Promise((resolve)=>{
handler = function(payload){
resolve(payload)
}
})
yield value
}
}
return {
handler,
generator
}
}
这是一个工厂函数,它产生
- 发电机
- 回调
需要将回调传递到流中。生成器需要传递到转换管道。
但是这个声明是不对的。我们不想在 Promise 的每次迭代中定义函数,而是希望在每次迭代中使用该函数来解决 Promise。
基本问题是如何在 promise 中定义回调,以便流可以耦合到生成器。
一种解决方法是在流和生成器之间使用缓冲区。
function makeCallbackGenerator() {
var buffer = []
var handler = function(payload){
buffer.push(payload)
return 1//consumed
}
var start = async function* () {
while(true){
if(buffer.length>0){
var next = buffer.pop()
debug("Generator yield")
yield next
}else {
await new Promise((resolve)=>{
setTimeout(()=>resolve(),1000)
})
}
}
}
return {
handler, start
}
}
有没有更简单的方法可以在没有缓冲区的情况下实现这一点?