簡體   English   中英

如何在沒有緩沖區的情況下在 javascript 中編寫異步流生成器

[英]How to code an async stream generator in javascript without a buffer

我們希望將來自生成器的流數據事件消耗到轉換/轉換管道中。

生成器的一種形式如下

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

有沒有更簡單的方法可以在沒有緩沖區的情況下實現這一目標?

我有同樣的問題,可以在沒有緩沖區和生成器的情況下簡化解決方案。

我終於在Node-Media-Server項目async branch 中找到了更好的具有異步功能的解決方案。

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

我測試了我使用提供的異步和生成器函數解決方案構建的 RTSP 服務器的性能,並得到了相同的結果。 我記得每個 cpu 核心有幾個 Gbits/sec 和 1000 個並發客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM