2016-06-13 16 views
1

Bitte lassen Sie mich wissen, wenn dies zu vage einer Frage ist, aber was sind die Vorteile der Verwendung einer ES6-Generator-Funktion im Gegensatz zu Versprechen? Ich sehe den Vorteil im Moment nicht und hoffte, dass jemand etwas Licht darauf werfen könnte.ES6 Generator Funktion vs Versprechen

Zum Beispiel, wenn die Daten in einer asynchronen Weise abrufen:

/* Using promises */ 
fetch('api-endpoint') 
    .then(resp => response.json()) 
    .then(name => obj.name) 
    .then(x => console.log('Name: ', name)) 

//VS 

/* As a generator function and assuming we have required node-fetch */ 
run(function *() { 
    const url = 'api-endpoint'; 
    const resp = yield fetch(url); 
    const obj = yield response.json(); 
    const name = yield obj.name; 
    console.log("Name available here: ", name); 
} 

function run(genFunc) { 
    const iterator = genFunc(); 
    const iteration = iterator.next(); 
    const promise = iteration.value(); 
    promise.then(x => { 
     const additionalIterator = iterator.next(x); 
     const additionalPromise = iterator.value; 
     additionalPromise.then(y => iterator.next(y)); 
    }); 
} 
+1

Es ist ziemlich vage. Kannst du zeigen, wie du sie benutzen würdest, um ähnliche Dinge zu tun? – 4castle

+0

Kein Problem, wird ein Beispiel hinzufügen. –

Antwort

2

Promises beschäftigen sich mit asynchronen Ereignissen, während Generatoren für ein leistungsfähiges Werkzeug zur Verfügung stellen Loops und Algorithmen zu schreiben, die einen eigenen Staat erhalten.

Von MDN Iterator and generators page

jedes der Elemente in einer Sammlung Verarbeitung ist ein sehr häufiger Betrieb. JavaScript bietet eine Reihe von Möglichkeiten zum Iterieren über eine Sammlung, von einfachen for-Schleifen bis hin zu map() und filter(). Iteratoren und Generatoren bringen das Konzept der Iteration direkt in den Kern Sprache und bieten einen Mechanismus zum Anpassen des Verhaltens von für ... von Schleifen.

Also ich denke, dass sie zwei sehr unterschiedliche Probleme lösen sollen.

Nachdem das gesagt wurde, you could use generators instead of promises, wie in Ihrem Beispiel, aber ich denke nicht, dass das, was sie waren für sie gedacht.

+0

Kein Problem, es ist ein nützlicher Kommentar, also habe ich es upvoted. Ich habe sie nur in Bezug auf den Umgang mit Async-Ereignissen betrachtet, aber sie scheinen im Umgang mit dem Blockieren von Loops usw. praktischer zu sein. Ich versuche nur, meinen Kopf um sie herum zu wickeln. –

+0

Sicher bin ich weit von einem Experten in der Sache selbst. Du könntest weitermachen und es akzeptieren, wenn es dir geholfen hat;) @DanWeber –