2016-05-03 4 views
2

Ich fragte diese question und wurde aufgefordert, die Promise-Konstruktor Anti-Pattern zu vermeiden. Ich habe den Artikel gelesen, aber ich bin mir nicht sicher, wie ich das Anti-Muster nicht verwenden soll. Dies ist die Funktion:Wie konvertiere ich diese Funktion, um nicht den Promise-Konstruktor antipattern zu verwenden

Ich habe alle meine Datenbankabfragen wie oben codiert. Dies ist mein Versuch, nicht das anti-Muster zu verwenden, aber als ich es nicht ganz verstehe ich glaube nicht so richtig ist entweder:

db.getUserCount = function() { 
    return new Promise (function (resolve, reject) { 
     db.users.count().then(function (result) { 
      return (result); 
     }).then(function(result) { 
      resolve(result); 
     }).catch(function(err) { 
      reject(err); 
     }); 
    }); 
}; 

, wie ich will guten Code zu schreiben, wenn jemand könnte Nimm dir eine Minute, um mir ein Beispiel zu zeigen, wie ich die obige Funktion benutze, indem ich das Anti-Pattern nicht verwende, das großartig wäre.

Antwort

0

Wenn die db.users.count()-Funktion eine asynchrone Operation ist, dann ist das, was Sie geschrieben haben, kein Anti-Muster. Das "anti-Muster" kommt herein, wenn die Methode synchron ist, und eine Verheißung wird zurückgegeben, um das Promise-Muster zu verwenden.

Der Schlüssel hier ist von einem Zitat aus einer anderen Stack Overflow question in der Frage verbunden verweisen Sie:

... Versprechungen sind über die Herstellung asynchronen Code die meisten der verlorenen Eigenschaften von synchronem Code beibehalten wie flacher Eindruck und ein Ausnahmekanal.

(Schwerpunkt, von mir)

Wenn der Code nicht asynchron ist, dann ein Versprechen der Rückkehr ist ein Anti-Muster.

Wie für die Rückkehr new Promise(...) ist ein Anti-Muster? Wenn das der Fall ist, ist die Rückkehr new Anything() ein Anti-Muster. Die Verwendung des Promise-Konstruktors ist in Ordnung.

+0

Dies ist falsch und irreführend. In der anderen Antwort finden Sie, wie Sie den Code richtig schreiben. –

+0

Auch ist Ihr Schwerpunkt nicht, was das Zitat überhaupt bedeutet. Ich weiß, weil du mich dort zitierst. Mit Promises kannst du kostenlos verketten und du brauchst nur "neues Versprechen" zu verwenden, wenn du eine API zu Versprechungen konvertierst, es ist sinnlos in einer bereits versprochenen API. –

+0

@BenjaminGruenbaum: Ich habe die Tatsache verpasst, dass der Code in der Frage bereits eine Zusage zurückgegeben hat, aber meine Aussage steht immer noch: "Wenn der Code nicht asynchron ist, dann ist die Rückgabe eines Versprechens ein Anti-Muster." Es ist einfach so, dass der Code in der Frage * bereits * asynchron ist und ein Versprechen zurückgibt, was das neue Versprechen nutzlos macht. –

4

Seit db.users.count() scheint bereits ein Versprechen zurückzukehren, können Sie dies nur tun:

db.getUserCount = function() { 
    return db.users.count(); 
}); 

Es gibt nicht braucht es in einem zusätzlichen Versprechen zu wickeln (mit new Promise(...)).

+0

Vielen Dank! Ich verpackte all meine Fragen in ein zusätzliches Versprechen und es gab keine Notwendigkeit. Das dürfte der Grund sein, warum ich in meinen Tests auch nie den Ausschuss erreichen konnte. – nasoj1100

Verwandte Themen