Die async
Bibliothek kapselt ein paar sein mit asynchronen Operationen, die Verwendung benannte Funktion anstelle von Anonyme Funktionen beschäftigen und asynchron über eine Liste iterieren. 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 es vereinfacht nur die asynchronen Muster in der Bibliothek enthalten.
Versprechen, im Gegensatz dazu sind meiner Meinung nach viel mehr allgemeine Lösung für das Problem des asynchronen Codes. Sie bieten nicht nur die offensichtlichen Vorteile auf den ersten Blick von fehleraufwirbelnden und abflachenden Callback-Pyramiden, Probleme, die sonst die Art von komplexen Mustern erfordern würden, können viel einfacher gelöst werden.
Ich werde dies mit einer kurzen Tour durch einige der verfügbaren Muster async
demonstrieren. so etwas wie dies zum Beispiel wird die async.waterfall
Funktion:
async.waterfall([
function (cb) {
asyncCall('argument', cb);
},
function(resultOfFirstCall, cb) {
anotherCall(resultOfFirstCall, 'someOtherArgument' cb);
},
], function(err, res) {
if (err) handle(err);
useFinalResult(res);
});
Es gibt kein Äquivalent zu async.waterfall
in den meisten Versprechen Bibliotheken (oder zumindest es nicht einen in Q), weil es so einfach sie umzusetzen von Grund auf neu Array.reduce
, wie so (zB auf Basis von Q aber so ziemlich das gleiche auf andere Versprechen Bibliotheken) mit:
[
function() {
return asyncCall('argument');
},
function(resultOfFirstCall) {
return anotherCall(resultOfFirstCall, 'someOtherArgument');
}
].reduce(Q.when, Q())
.then(useFinalResult, handle);
die anderen großen Funktionen in async
umfassen async.parallel
, die Q enthält als Q.all
:
// async
async.parallel([
asyncFunc,
asyncFunc2
], function(err, res) {
if (err) handle(err);
useFinalResult(res);
// res[0] === asyncFuncResult
// res[1] === asyncFunc2Result
});
// Q
Q.all([
asyncFunc(),
asyncFunc2()
]).then(useFinalResult, handle);
Und async.map
.Sie tatsächlich brauchen nichtasync.map
wenn Sie verspricht verwenden, weil die normale Array.map
ausreichend ist:
// async
async.map(['file', 'file2', 'file3'], fs.stat, function(err, res) {
if (err) handle(err);
useFinalResult(res);
});
// Q
Q.all(['file', 'file2', 'file3']
.map(Q.nfbind(fs.stat)))
.then(useFinalResult, handle);
Der Rest async
ähnlich einfach ist prägnant zu implementieren, mit relativ einfachen Teile Ihrer Versprechen Bibliothek. (Beachten Sie, dass das letzte Beispiel eine Funktion verwendet Q.nfbind
: nfbind
und die anderen nf*
Funktionen Q bietet im Grunde alles, was Sie Versprechen mit NodeBack-APIs verwenden müssen, so gibt es nicht einmal eine besonders große Impedanz versucht, Versprechen mit Bibliotheken, die NodeBacks erwarten verwenden .) Am Ende, ob Sie Versprechungen oder Nodebacks verwenden, liegt an Ihnen, aber ich denke, Versprechungen sind eine viel flexiblere, fähige und allgemein prägnante Möglichkeit, die meisten asynchronen Operationen zu implementieren.
Callbacks are imperative, promises are functional ist eine Lektüre für weitere Informationen in diesem allgemeinen Ader wert.
Der Hauptvorteil der Verwendung der verknüpften async-Bibliothek besteht darin, dass * eine Anzahl gängiger Operationen in einem asynchronen Stil * umgebrochen/bereitgestellt wird. Während "einfache" [Promises] (http://wiki.commonjs.org/wiki/Promises/A) (dh jQuery.Deferred) verwendet werden kann, würde es viel mehr boilerplate (wenn eine dieser Operationen in einem gewünscht wird asynchronen Stil), da Sie Ihre eigenen Versionen dieser Funktionen schreiben müssten. Die verknüpften Async-Bibliotheken und Promises funktionieren auf die gleiche Weise - ein * Callback * wird verwendet. –
Was ich an Versprechungen mag, ist, dass du etwas von einer Funktion zurückbringst und stattdessen einen Rückruf annimmst, den du später anrufen wirst (für mich ist es wie: Ich kann dir diesen Wert in diesem Moment nicht zurückgeben, aber ich verspreche dir das wird einen Wert erhalten). Was ich nicht mag ist, dass Sie 2 Funktionen bestehen müssen, aber das wird gelöst, wenn EcmaScript Harmony bereit ist. Angesichts der Tatsache, dass Task.js so großartig ist, sind Versprechen wirklich zukunftssicher. Vielleicht wird es interessant sein, ein Modul zu entwickeln, das die Lücke zwischen Versprechen und Rückrufen schließt (so etwas wie Async, aber ein Versprechen). –