Die Lösung eines latenten mit Winkel-s $q.wenn() mit ein Grund

Möchte ich $q.when() zu wickeln, einige nicht-Versprechen Rückrufe. Aber ich kann nicht herausfinden, wie zu lösen, das Versprechen aus, innerhalb der callback. Was mache ich in der anonymen Funktion zu zwingen $q.when() zu beheben, mit meinem Grund?

promises = $q.when(
    notAPromise(
        //this resolves the promise, but does not pass the return value vvv
        function success(res) { return "Special reason"; },
        function failure(res) { return $q.reject('failure'); }
    ) 
);

promises.then(
    //I want success == "Special reason" from ^^^
    function(success){ console.log("Success: " + success); },
    function(failure){ console.log("I can reject easily enough"); }
);

Die Funktionalität, die ich duplizieren möchten, ist dies:

promises = function(){
    var deferred = $q.defer();

    notAPromise(
        function success(res) { deferred.resolve("Special reason"); },
        function failure(res) { deferred.reject('failure'); }
    ); 

    return deferred.promise;
};

promises.then(
    //success == "Special reason"
    function(success){ console.log("Success: " + success); },
    function(failure){ console.log("I can reject easily enough"); }
);

Ist das gut, aber when() so schön aussieht. Ich kann einfach nicht passieren das beheben Nachricht an then().


UPDATE

Gibt es bessere, robustere Möglichkeiten, dies zu tun. $q exceptions wirft synchron, und wie @Benjamin weist darauf hin, die großen Versprechen libs bewegt, mit voller Versprechungen statt Deferreds.

Sagte, diese Frage ist auf der Suche nach einem Weg, dies zu tun mit $q's when() Funktion. Objektiv überlegen Techniken sind natürlich willkommen, aber keine Antwort auf diese spezifische Frage zu stellen.

  • Wenn Ihr Rückrufe werden nicht Versprechen Rückrufe, warum würden Sie interagieren mit dem Versprechen, überhaupt?
  • Ich... nicht... weiß... ??? Das ist whay ich bin versucht, wickeln Sie es in, wenn (), so kann ich promisify nur, dass die Methode aufrufen.
  • Ich dachte, es sollten arbeiten aus den docs: "Dies ist nützlich, wenn Sie sind den Umgang mit einem Objekt, das möglicherweise oder möglicherweise nicht werden, ein Versprechen..." docs.angularjs.org/api/ng.$q#!
  • tut notAPromise Aufruf des callbacks asyncronously? Wenn so müssen Sie sich nicht die $timeout. Und selbst wenn Sie tun müssen, verwenden Sie $timeout sollten Sie brauchen, um eine Zeitspanne angeben (z.B. 1000). Außer, dass ich denke, die Art und Weise, die Sie getan haben, es ist der beste Weg, es zu tun
  • Du hast Recht, $timeout ist nicht erforderlich und könnte verwirrend sein, die Frage.
InformationsquelleAutor willoller | 2013-09-03
Schreibe einen Kommentar