Ich habe kriskowal's Q library für ein Projekt (Web-Scraper/Mensch-Aktivität-Simulator) verwendet und Versprechungen kennengelernt, sie zurückgegeben und sie auflösen/ablehnen, und die grundlegende asynchrone Kontrolle der Bibliothek Flussmethoden und Fehler-werfende/fangende Mechanismen haben sich als wesentlich erwiesen.Node.js Asynchronous Library Vergleich - Q vs Async
Ich habe jedoch einige Probleme festgestellt. Meine promise.then
Anrufe und meine Rückrufe haben die unheimliche Tendenz, Pyramiden zu bilden. Manchmal ist es aus Scoping-Gründen, manchmal ist es eine bestimmte Reihenfolge von Ereignissen zu garantieren. (Ich nehme an, ich könnte einige dieser Probleme durch Refactoring beheben, aber im nächsten Schritt möchte ich die "Callback-Hölle" ganz vermeiden.)
Debugging ist auch sehr frustrierend. Ich verbringe viel Zeit console.log
-ing meinen Weg zu der Quelle von Fehlern und Bugs; nachdem ich sie endlich gefunden habe, werde ich anfangen, Fehler dort zu werfen und sie irgendwo anders mit promise.finally
zu fangen, aber der Prozess der Lokalisierung der Fehler an erster Stelle ist mühsam.
Auch in meinem Projekt, Bestellung Angelegenheiten. Ich muss so ziemlich alles nacheinander machen. Oftmals erzeuge ich Arrays von Funktionen, die Versprechungen zurückgeben und sie dann aneinander ketten, indem ich Array.prototype.reduce
verwende, was ich meiner Meinung nach nicht tun sollte. Hier
ist ein Beispiel für ein meine Methoden, die diese Reduktion Technik verwendet:
removeItem: function (itemId) {
var removeRegexp = new RegExp('\\/stock\\.php\\?remove=' + itemId);
return this.getPage('/stock.php')
.then(function (webpage) {
var
pageCount = 5,
promiseFunctions = [],
promiseSequence;
// Create an array of promise-yielding functions that can run sequentially.
_.times(pageCount, function (i) {
var promiseFunction = function() {
var
promise,
path;
if (i === 0) {
promise = Q(webpage);
} else {
path = '/stock.php?p=' + i;
promise = this.getPage(path);
}
return promise.then(function (webpage) {
var
removeMatch = webpage.match(removeRegexp),
removePath;
if (removeMatch !== null) {
removePath = removeitemMatch[0];
return this.getPage(removePath)
.delay(1000)
// Stop calling subsequent promises.
.thenResolve(true);
}
// Don't stop calling subsequent promises.
return false;
}.bind(this));
}.bind(this);
promiseFunctions.push(promiseFunction);
}, this);
// Resolve the promises sequentially but stop early if the item is found.
promiseSequence = promiseFunctions.reduce(function (soFar, promiseFunction, index) {
return soFar.then(function (stop) {
if (stop) {
return true;
} else {
return Q.delay(1000).then(promiseFunction);
}
});
}, Q());
return promiseSequence;
}.bind(this))
.fail(function (onRejected) {
console.log(onRejected);
});
},
ich andere Methoden, die im Grunde das gleiche tun, aber von viel schlechter Einbuchtung Leiden leiden.
Ich überlege, Refactoring mein Projekt mit coalan's async library. Es scheint Q ähnlich zu sein, aber ich möchte genau wissen, wie sie sich unterscheiden. Der Eindruck, den ich bekomme, ist, dass Async mehr "callback-centric" ist, während Q "Promise-centric" ist.
Frage: Angesichts meiner Probleme und Projektanforderungen, was würde ich gewinnen und/oder verlieren durch die Verwendung von Async über Q? Wie vergleichen die Bibliotheken? (Vor allem in Bezug auf die Ausführung Reihe von Aufgaben der Reihe nach und Debuggen/Fehlerbehandlung?)
Die Anforderung einer sequenziellen Ausführung scheint die meisten Vorteile von async zunichte zu machen. –
Die Leute könnten Sie wahrscheinlich besser beraten, wenn Sie einen besonders unhandlichen Code zeigen, den Sie jetzt verwenden, für den Sie eine bessere Lösung wünschen. Das Diskutieren von Vor- und Nachteilen verschiedener Bibliotheken oder wie man diese Bibliotheken benutzt, ist im Abstrakten viel schwieriger. – jfriend00
@ jfriend00 Ich stimme zu; Ich habe ein Codebeispiel hinzugefügt. – Jackson