Асинхронный генератор в Nodejs для рекурсивной выборки обещаний - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь рекурсивно сканировать таблицу MySQL и обрабатывать строки в пакетном режиме.ids эквивалентно массиву строк, а promise1 извлекает кусок строк и promise2 обрабатывает их.Это то, что я реализовал до сих пор.Это работает, как ожидалось.Как я могу улучшить это, чтобы упростить дальнейшее?

const ids=[]
for(let i=0;i<50;i++){
    ids.push(i)
}
const promise1=(limit,after=-1)=>new Promise(r=>setTimeout(()=>r(ids.slice(after+1,after+limit+1)),1000))
const promise2=a=>new Promise(r=>setTimeout(()=>r(a.map(b=>b*2)),1000))
async function* promiseGen(){
    let limit=10
    let after=-1
    while(true){
        let pr1=await promise1(limit,after)
        if(pr1.length==0){
            break
        }
        yield pr1
        console.log(pr1)
        after=pr1[pr1.length-1]
    }
}
async function processor(){
    let pr1=promiseGen()
    let result=[]
    while(true){
        let data=await pr1.next()
        if(data.done){
            break
        }
        let res=await promise2(data.value)

        result.push(res)

    }
    return result
}

processor().then(res=>console.log(res))

1 Ответ

0 голосов
/ 19 декабря 2018

Используйте for await … of петлю :

async function processor() {
    const result = [];
    for await (const val of promiseGen()) {
        result.push(await promise2(val))
    }
    return result;
}
...