[英]How to implement an async generator to stream with node Readable stream?
[英]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.