2015-06-27 10 views
5

Siehe Rookie Fehler # 4 konvertieren: mit „latenten“ in Nolan Lawson ‚s-Artikel: (! Btw einen großen Beitrag) We have a problem with promises, ich versuche nicht aufgeschobenes Stil Versprechen zu verwenden nicht mehr. Kürzlich bin ich auf ein praktisches Beispiel gestoßen, dass ich nicht herausfinden kann, wie ich das NICHT verzögert schreiben kann, also brauche ich ein paar Ratschläge. HierWie diese latenten Stil Versprechen ES6 Stil Versprechen

ist das Beispiel, eine Winkel Fabrik:

function ConfirmModal($q, $modal) { 
    return { 
     showModal: function _showModal(options) { 
      var _modal = $modal(options) 
      var deferred = $q.defer() 

      _modalScope.confirm = function(result) { 
       deferred.resolve(result) 
       _modal.hide() 
      } 

      _modalScope.cancel = function(reason) { 
       deferred.reject(reason) 
       _modal.hide() 
      } 

      return deferred.promise 
     } 
    } 
} 

Ich verstecke einige unabhängige Details, die Kernidee ist (zB Implementierung von _modalScope.): $modal bieten eine ui Widget, das mit zwei Tasten enthält: Bestätigen und Abbrechen. Wenn Bestätigen Sie wurde angeklickt, Anruf _modalScope.confirm und die verzögerte Zusage auflösen, andernfalls lehnen die verzögerte Zusage durch den Aufruf _modalScope.cancel, wenn Abbrechen wurde geklickt.

Ich habe versucht, mithilfe von return $q(function(resolve, reject) { ... }) neu zu schreiben, aber ich weiß wirklich nicht, wie/wann resolve und reject in diesem Konstruktor aufzurufen, weil die wirkliche Logik in der _modalScope.confirm/cancel Methode. Ich habe tagelang mit diesem Problem zu kämpfen, hoffe wirklich, dass mir jemand helfen kann.

Danke!

+1

In der Tat, Sie sind die [latenten Antipattern] nicht verwenden (http : //stackoverflow.com/q/23803743/1048572) hier, denn '$ modal' ist noch kein Versprechen api. Zurückgestellte sind völlig in Ordnung, um Dinge zu promitifizieren! – Bergi

+0

@Bergi oh, ziemlich Punkt, ich habe das nicht erkannt, danke! – nightire

Antwort

4

den Code in Ihren Fragen Vorausgesetzt, funktional und _modalScope ist von der _showModal() Funktion, dann sollte der Code unten Ihre Frage beantworten:

function ConfirmModal($q, $modal) { 
    return { 
     showModal: function _showModal(options) { 
      return $q(function(resolve, reject) { 
       var _modal = $modal(options) 

       _modalScope.confirm = function(result) { 
        resolve(result) 
        _modal.hide() 
       } 

       _modalScope.cancel = function(reason) { 
        reject(reason) 
        _modal.hide() 
       } 
      }); 
     } 
    } 
} 
+0

Ich habe das schon einmal ausprobiert und ich dachte, es funktioniert nicht, und ich habe es noch einmal versucht, nachdem ich deine Antwort gelesen habe, es funktioniert tatsächlich! Ich dachte, es funktioniert nicht, weil Winkel wirft einen Fehler, aber ich habe es nicht sorgfältig gelesen, stellt sich heraus, der Fehler ist nicht im Zusammenhang mit dieser Änderung, meine schlecht. Vielen Dank. – nightire

+0

Gern geschehen! :-) – JME

+0

Funktioniert nicht mit Angular 1.2. Unsicher über Angular 1.3. Scheint mit Angular 1.4 und 1.5 zu arbeiten. –

Verwandte Themen