Как кодировать генератор асинхронного потока в JavaScript без буфера
Мы хотим использовать события потоковых данных из генератора в конвейер преобразования / преобразования.
Одна из форм генераторов заключается в следующем
var generator = async function* () {
var value
while(true){
value = await new Promise((resolve)=>{
value = ... // some functionality
resolve(value)
})
yield value
}
}
Предположим, что существует поток данных, который производит значения. Доступна заводская функция, которая принимает функцию обработчика
async function makeStream(handler) {
...
}
Функция handle предоставит полезную нагрузку, представляющую значение, полученное из потока.
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
}
}
Это заводская функция, которая производит
- генератор
- обратный звонок
Обратный вызов необходимо передать в поток. Генератор должен пройти в трубопровод преобразования.
Но это заявление не правильно. Мы не хотим определять функцию на каждой итерации обещания, вместо этого мы хотим использовать функцию для разрешения обещания на каждой итерации.
Основная проблема заключается в том, как определить обратный вызов в обещании, чтобы поток мог быть связан с генератором.
Обходной путь - использовать буфер между потоком и генератором.
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
}
}
Есть ли более простой способ достичь этого без буфера?
0 ответов
У меня был такой же вопрос, можно ли упростить решение без буфера и генератора.
Я наконец нашел для себя гораздо лучшее решение с функцией async в проекте Node-Media-Server, ветке async.
В v1.2.7 есть функция генератора.
Я протестировал производительность созданного мной RTSP-сервера с использованием как асинхронных решений, так и функций генератора, и получил те же результаты. Насколько я помню, несколько Гбит / с и 1000 одновременных клиентов на ядро процессора.