1

我们希望将来自生成器的流数据事件消耗到转换/转换管道中。

生成器的一种形式如下

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
    }
}

有没有更简单的方法可以在没有缓冲区的情况下实现这一点?

4

1 回答 1

0

我有同样的问题,可以在没有缓冲区和生成器的情况下简化解决方案。 

我终于在Node-Media-Server项目async branch中为我找到了更好的异步功能解决方案。

在 v1.2.7 中带有生成器功能

我测试了我使用提供的异步和生成器功能解决方案构建的 RTSP 服务器的性能,并得到了相同的结果。我记得每个 cpu 核心有几个 Gbits/sec 和 1000 个并发客户端。

于 2020-07-22T06:05:06.260 回答