task.js Generatoren / Versprechen im Vergleich zu asynchronen Callbacks

8

Ich möchte wissen, welche der beiden Methoden beim Umgang mit asynchronem Code in JavaScript besser sind. Ich möchte verstehen, welche Methode zu saubereren Code führt. Ich bin mit Versprechungen vertraut und sie scheinen flexibler als der asynchrone Ansatz ( Ссылка ).

Ich kenne auch die Task.js-Bibliothek ( Ссылка ), aber dies beruht auf dem Schlüsselwort yield, das Teil von Ecmascript Harmony ist.

    
Daniel Uzunu 19.03.2013, 00:09
quelle

4 Antworten

11

Die async -Bibliothek kapselt einige sehr gebräuchliche asynchrone Muster ein, darunter das parallele Ausführen beliebiger Async-Aufrufe und das asynchrone Iterieren über eine Liste. Es wurde entwickelt, um mit "nodeback" (err, res) APIs zu arbeiten, was es für viele Node.js-Anwendungen nützlich macht. async ist jedoch eine spezifische Lösung und vereinfacht nur die asynchronen Muster, die in der Bibliothek enthalten sind.

Im Gegensatz dazu sind Versprechen meiner Meinung nach eine viel allgemeinere Lösung für das Problem des asynchronen Codes. Sie bieten nicht nur auf den ersten Blick die offensichtlichen Vorteile von Fehler-sprudelnden und abflachenden Callback-Pyramiden, Probleme, die sonst die Art von komplexen Mustern erfordern würden async eingekapselt lassen sich viel einfacher lösen.

Ich demonstriere dies mit einer kurzen Tour durch einige der verfügbaren Muster von async . Zum Beispiel wird die Funktion async.waterfall in etwa so verwendet:

%Vor%

Es gibt kein Äquivalent zu async.waterfall in den meistversprechenden Bibliotheken (oder zumindest gibt es keins in Q), weil es so einfach ist, es von Grund auf mit Array.reduce zu implementieren, so (Beispiel basierend auf Q, aber ziemlich ähnlich in anderen Versprechungsbibliotheken):

%Vor%

Die anderen großen Funktionen in async enthalten async.parallel , die Q als Q.all enthält:

%Vor%

Und async.map . Du brauchst nicht async.map , wenn du Versprechungen verwendest, weil das normale Array.map ausreichend ist:

%Vor%

Der Rest von async ist ähnlich einfach zu implementieren, indem relativ einfache Teile Ihrer Versprechens-Bibliothek verwendet werden. (Beachten Sie, dass das letzte Beispiel eine Funktion Q.nfbind : nfbind verwendet und die anderen nf* -Funktionen Q im Grunde alles, was Sie brauchen, um Versprechen mit NodeBack-APIs zu verwenden, so dass nicht einmal eine besonders große Impedanz versucht zu verwenden verspricht mit Bibliotheken, die nodebacks erwarten.)

Am Ende hängt es von Ihnen ab, ob Sie Versprechen oder Nodebacks verwenden, aber ich denke, Versprechen sind eine viel flexiblere, fähigere und allgemein prägnante Möglichkeit, die meisten asynchronen Operationen zu implementieren.

Callbacks sind unerlässlich, Versprechungen sind funktional ist es wert, für weitere Informationen in diesem allgemeinen Sinne gelesen zu werden.

    
00dani 24.07.2013 07:32
quelle
3

Da Sie Ihre Frage mit einem Knoten versehen haben, würde ich die Async-Bibliothek empfehlen. Die Kontrollflussfunktionen sind großartig, um mit den hässlichen und schwer zu verfolgenden Rückrufketten zu arbeiten und diese zu beseitigen. Die API ist sehr gut eingerichtet, um Callbacks einzufügen, die der Signatur des Knotens (error, result) in die Kontrollfunktionen folgen. Es ist grundsätzlich in fast allen Knoten-Skripten enthalten, die ich schreibe.

Sie können zwar auch async für die Client-Seite verwenden, dies ist jedoch für die meisten Projekte wahrscheinlich unnötig. jQuery enthält Versprechen, und Sie können das gleiche mit ihnen erreichen.

    
Andrew Kirkegaard 19.03.2013 00:44
quelle
1

Ich denke Versprechen / a und async lib mit Unterschied Ziele, versprechen Fokus auf einen Schritt asynchrone Operation Fortschritt, und asynchrone Fokus auf Multi-Schritt-Async betreiben, für Knoten, async hat eine wildere Verwendung für viele async apis.

Übrigens, um mit asynchronen Operationen umzugehen, wird die benannte Funktion anstelle von anonymen Funktionen der effektivste Weg sein

    
Torrent Lee 19.03.2013 00:54
quelle
0

gumballhead empfohlen async.js , aber ich würde empfehlen, Parse zu verwenden Cloud Code , wenn Sie mit Node arbeiten. Ihre API hat Versprechen, zusammen mit anderen Goodies (wie eine Datenbank) eingebaut. Es spart Zeit und Sie müssen sich keine Gedanken über die Backend-Stabilität machen. Sie können jedes NPM-Modul mit einem kleinen Tweak von module.exports in nur exports einfügen. Es fügt sich auch nahtlos in Ihr Frontend ein! Ich habe mit diesem Ansatz in meinem aktuellen Projekt Erfolg gehabt und wollte nur einen neuen Ansatz kommentieren.

Fühlen Sie sich frei, mit irgendwelchen Gründen zu kommentieren, warum / wann Sie nicht Cloud Code verwenden sollten; denn ich habe noch keine solche Erfahrung.

    
aleclarson 10.02.2014 00:47
quelle