2015-02-01 11 views
8

Capisco come utilizzare i generatori per rendere il codice asincrono bello. Ho un semplice generatore *all, che prende uno page, restituirà un singolo valore.Come eseguire un'attività asincrona contro i generatori es6 in loop

Quindi ho un altro generatore *allDo, che utilizzerà *all per le pagine da 1 a 30 e per ogni risultato, fare un po 'asincrono task.

Quindi ho un altro generatore *allBatchDo, che eseguirà il batch di 3 pagine e eseguirà alcune operazioni asincrone task.

function mockPromise(value) { 
    return Promise(function(resolve, reject) { 
    resolve(value); 
    }); 
} 

function *all(page) { 
    var ls = yield mockPromise("page " + page); 
    // do all kinds of promises 
    return yield ls; 
}; 

function *allDo(task) { 
    var page = 1; 
    while (true) { 
    var res = yield * all(page); 

    res = yield task(res); 

    if (page == 30) { 
     break; 
    } 
    page++; 
    } 
} 

function *allBatchDo(task) { 
    var page = 1; 
    var arr = []; 
    while (true) { 
    var res = yield * all(author, page); 

    arr.push(res); 
    if (arr.length >= 3) { 
     yield task(arr); 
     arr = []; 
    } 

    if (page == 30) { 
     break; 
    } 

    page++; 
    } 
} 

function logTask(res) { 
    return mockPromise(res).then(function(v) { 
    console.log(v); 
    }); 
} 

uso Esempio di questi generatori sarebbe:

// return a single page promise 
async(all(1)).then(function(value) { console.log(value); }); 

// do `logTask` for all pages 1 thru 30 
async(allDo(logTask)); 

// do `logTask` for all pages with batches of 10 
async(allBatchDo(logTask)); 

La domanda è, questo è un uso legittimo delle caratteristiche ES6 asincrone, o c'è un abstract soluzione integrata per il mio caso d'uso?

+0

hai dato un'occhiata a Promise.all()? – the8472

+0

Dopo aver raccolto i valori tramite promesse, restituisco un 'task' asincrono che restituisce una promessa, che aspetto che consumi i valori, quindi ripeta il processo. Sto chiedendo è legittimo, o c'è un modo migliore? @ the8472 – eguneys

+0

Non sono sicuro di quale sia la tua domanda. Il tuo codice è abbastanza strano; sembra che fosse meglio chiedere a [codereview.SE]. – Bergi

risposta

4

Se si desidera utilizzare i generatori per rendere asincrono, il codice è valido. ES6 contiene solo promesse per operazioni asincrone. ES7 avrà async/await. È inoltre possibile utilizzare una buona libreria: https://github.com/kriskowal/q o utilizzare solo promesse native Promise.Tutti senza generatori.

0

Direi che questo codice potrebbe essere piuttosto lento, dal momento che si sta usando yield * tutto il task verrà eseguito sequenzialmente potenzialmente impiegando molto più tempo del necessario (supponendo che mockPromise ne faccia un po ') si potrebbe essere meglio cedere Promise.all o usando solo promesse

anche l'utilizzo di while (true) è molto strano ..

Problemi correlati