2015-02-01 7 views
8

Ich verstehe, wie man Generatoren verwendet, um asynchronen Code schön aussehen zu lassen. Ich habe einen einfachen Generator *all, der eine page nimmt, wird einen einzelnen Wert zurückgeben.So führen Sie eine asynchrone Aufgabe gegen es6-Generatoren in Schleife durch

Dann habe ich einen anderen Generator *allDo, der *all für die Seiten 1 bis 30 verwenden wird und für jedes Ergebnis async task tun.

Dann habe ich einen anderen Generator *allBatchDo, der 3 Seiten Stapel wird, und tun einige asynchrone 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); 
    }); 
} 

Beispiel für die Verwendung dieser Generatoren wäre:

// 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)); 

Die Frage ist, ist dies eine legitime Verwendung von es6 Asynchron-Funktionen, oder gibt es eine abstrakte integrierte Lösung für meinen Anwendungsfall?

+0

Haben Sie sich Promise.all() angesehen? – the8472

+0

Nachdem ich Werte durch Versprechen gesammelt habe, gebe ich eine asynchrone "Aufgabe" ab, die ein Versprechen zurückgibt, auf das ich warte, bis es die Werte verbraucht hat, und dann den Prozess wiederhole. Ich frage, ist das legitim, oder gibt es einen besseren Weg? @ the8472 – eguneys

+0

Ich bin mir nicht sicher, was deine Frage ist. Dein Code ist ziemlich merkwürdig; Das sieht so aus, als wäre es bei [codereview.SE] besser gefragt worden. – Bergi

Antwort

4

Wenn Sie Generatoren verwenden möchten, um async zu machen, dann ist der Code gültig. ES6 enthält nur Versprechen zu asynchronen Operationen. ES7 wird async/erwarten. Sie können auch eine gute Bibliothek verwenden: https://github.com/kriskowal/q oder verwenden Sie nur native Versprechen Promise.All ohne Generatoren.

0

Ich würde sagen, dass dieser Code sehr langsam sein kann, da Sie yield * verwenden, wird die gesamte Aufgabe sequenziell ausgeführt und nimmt möglicherweise viel mehr Zeit in Anspruch als nötig (vorausgesetzt, mockPromise tut etwas io) nur mit Versprechungen

auch Ihre Benutzung while (true) ist sehr seltsam ..