Was ist das explizite Versprechen Bau Antipattern und wie vermeide ich es?
Ich das schreiben von code, der etwas tut, das sieht aus wie:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
//or = new $.Deferred() etc. | //using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Jemand sagte mir, dies nennt man die "latente antipattern" oder die "Promise
Konstruktor antipattern" bzw.,, was ist schlecht daran, wenn dieser code und warum heißt das eine antipattern?
InformationsquelleAutor der Frage Benjamin Gruenbaum | 2014-05-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den latente antipattern (jetzt explizit-Konstruktion anti-pattern) geprägt durch Esailija ist ein häufiges anti-pattern Leute, die Versprechungen machen, die ich gemacht habe, es mich, als ich zum ersten mal verspricht. Das problem mit dem obigen code ist, dass ist nicht nutzen die Tatsache, dass verspricht Kette.
Verspricht Kette können mit
.then
und Sie können zurückkehren, verspricht direkt. Ihren code ingetStuffDone
kann umgeschrieben werden als:Versprechungen machen asynchronen code besser lesbar und Verhalten sich wie synchroner code ohne verschleiert werden. Verspricht repräsentieren eine Abstraktion, die über einen Wert von einer Zeit Betrieb, Sie Abstrakt die Vorstellung, eine Anweisung oder ein Ausdruck in einer Programmiersprache.
Sollten Sie nur verwenden, latente Objekte, wenn Sie die Konvertierung eines API verspricht und kann es nicht automatisch, oder, wenn Sie schreiben aggregation-Funktionen, die einfacher auf diese Weise dargestellt.
Zitieren Esailija:
InformationsquelleAutor der Antwort Benjamin Gruenbaum
Was ist Los mit ihm?
Haben Sie Glück gehabt. Leider ist es wohl nicht, wie Sie wahrscheinlich vergessen einige Rand-Fall. In mehr als der Hälfte der Vorgänge die ich gesehen hab, hat der Autor vergessen zu kümmern sich um die Fehler-handler:
Wenn das andere Versprechen, wird abgelehnt, dies geschieht unbemerkt statt propagiert, um die neuen Versprechen (wo es bekommen würde behandelt werden) - und die neue Verheißung bleibt ewig anhängig, die Lecks zu induzieren.
Das gleiche passiert in dem Fall, dass der callback-code führt zu einem Fehler - zum Beispiel, wenn
result
nichtproperty
und eine exception wird geworfen. Das würde gehen, unbehandelte und lassen Sie das neue Versprechen ungelöst.Im Gegensatz dazu
.then()
automatisch kümmern sich um diese beiden Szenarien, und lehnt die neue Verheißung, wenn ein Fehler passiert:Den latenten antipattern ist nicht nur umständlich, sondern auch fehleranfällig. Mit
.then()
für die Verkettung ist viel sicherer.Wirklich? Gut. Diese wird jedoch ziemlich detailliert und ausgiebig, vor allem, wenn Sie ein Versprechen-Bibliothek, die unterstützt auch andere Funktionen, wie Storno-oder message-passing. Oder vielleicht wird es in der Zukunft, oder Sie tauschen wollen Ihrer Bibliothek gegen eine bessere? Sie werden nicht wollen, ändern Sie Ihren code für die.
Bibliotheken " Methoden (
then
) nicht nur native Unterstützung für alle Funktionen, die Sie auch haben könnte, bestimmte Optimierungen im Ort. Mit Ihnen wird wahrscheinlich machen Sie Ihren code schneller ist, oder zumindest können optimiert werden durch zukünftige Revisionen der Bibliothek.Wie vermeide ich es?
Also, wenn Sie finden, sich selbst manuell erstellen eines
Promise
oderDeferred
und die bereits vorliegenden zusagen beteiligt sind, überprüfen Sie die Bibliotheks-API-erste. Die Latenten antipattern wird oft angewendet von Menschen, die Sie sehen verspricht [nur] als Beobachter-Muster - aber Versprechungen sind more als Rückrufe: Sie sollen zusammensetzbar. Jede anständige Bibliothek hat viele einfach zu bedienende Funktionen für die Zusammensetzung verspricht in jeder denkbaren Art und Weise, kümmert sich um alle von der low-level-Sachen, die Sie nicht wollen, zu beschäftigen.Wenn Sie gefunden haben, eine Notwendigkeit zu Komponieren, die einige Versprechen in einer neuen Weise, die nicht unterstützt wird, indem eine vorhandene helper-Funktion schreiben eigene Funktion mit unvermeidbaren Deferreds sollte Ihre Letzte option. Die Umstellung auf eine mehr ausgereifter Bibliothek, und/oder Fehlerberichte gegen Ihre aktuelle Bibliothek. Seine Betreuer sollte in der Lage sein, um daraus die Zusammensetzung aus vorhandenen Funktionen, implementieren Sie eine neue Hilfsfunktion für Sie und/oder helfen, um die Kante Fälle, die behandelt werden müssen.
InformationsquelleAutor der Antwort Bergi