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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Kern des Problems
Sie sind im Grunde versucht, zu konvertieren einer vorhandenen callback-API verspricht. In Eckigen
$q.when
ist für Versprechen aggregation, und für thenable assimilation (das heißt, Sie arbeiten mit einem anderen Versprechen, Bibliothek). Angst nicht, was Sie wollen, ist vollkommen machbar, ohne die cruft ein Handbuch latente jeder Zeit.Latente Objekte, und das Versprechen Konstruktor
Traurig, mit Winkel-1.x sind Sie stecken mit der veralteten latente Schnittstelle, die nicht nur wie gesagt Sie ist hässlich, es ist auch unsicher (es ist riskant und wirft synchron).
Was Sie möchten, nennt das Versprechen Konstruktor, das ist es, was alle Implementierungen (Bluebird -, Q -, Wenn -, RSVP -, native verspricht, etc) wechseln zu da ist es schöner und sicherer.
Hier ist, wie Ihre Methode Aussehen würde, mit einheimischen verspricht:
Können Sie replizieren diese Funktionalität in
$q
natürlich:Was würde Sie tun:
Eine automatische promisification Helfer
Natürlich, es ist gleichermaßen einfach zu schreiben ist eine automatische promisification Methode für Ihren konkreten Fall. Wenn Sie arbeiten mit einer Menge von APIs, die mit dem callback-Konvention
fn(onSuccess, onError)
Sie tun können:Damit würden Sie tun:
Ist sogar ordentlicher
resolve()
mit einem parameter. Es ist einfach zureject()
mit einem parameter mitwhen()
, aber nichtresolve()
, daresolve()
ist nur eine Methodedeferred
, und kann nicht zugegriffen werden, mit$q.resolve(...)
. Die root die Frage ist jedoch, wie Sie sagen - einen besseren Weg, um promisify der API-Aufruf. Ich habe nur versucht, es zu tun mit$q.when()
.$q.when
Umsetzung tut, ist das wickeln einfach den übergebenen Wert mit einem zusätzlichen latenten (schlauer Versprechen Bibliotheken können sogar vermeiden, dass, wenn übergeben, ein Versprechen) und gibt dann ein Versprechen auf, dass (unter Verwendung der Tatsache verspricht rekursiv packen) - Sie können es hier zu sehen github.com/angular/angular.js/blob/master/src/ng/q.js#L421-L467 , wenn Sie ignorieren die (eher nutzlose) code für die zusätzlichen Parameter, es ist im Grundefunction when(val){ var d = $q.defer(); d.resolve(val); return d.promise;}
.val
Recht? InnextTick()
statt der Lösung mitval
es löst sich mit dem Ergebnis derref(val).then(wrappedCallback, wrappedErrback, wrappedProgressback)
. Halten Sie im Verstand ich habe genug wissen, um Verwendung ein Versprechen-Bibliothek, aber Konzeption ist eine quälend außer Reichweite. Vielen Dank für Ihre Hilfe!$q.when()
) und ich hoffe, dass bei der Lösung Ihrer eigentlichen problem.Ok hier ist meine interpretation von dem, was ich denke, Sie wollen.
Ich bin angenommen, Sie wollen integrieren, nicht Versprechen Rückrufe, die mit einer latenten/Versprechen?
Das folgende Beispiel verwendet die
wrapCallback
Funktion wickeln Sie zwei nicht-Versprechen Rückrufe,successCallback
underrCallback
. Die nicht-Versprechen Rückrufe, die jeweils einen Wert zurück, und dieser Wert wird verwendet, um entweder beheben oder Ablehnung der latente.Ich die Verwendung einer Zufallszahl, um festzustellen, ob die latente gelöst werden sollte oder zurückgewiesen, und es wird beschlossen oder abgelehnt wird mit der return-Wert aus dem nicht-Versprechen Rückrufe.
Nicht eckig-code:
Angular code:
Beispiel für die Ausgabe, wo die Zufallszahl ist kleiner als
0.5
, und so die latente abgelehnt wurde.when
- "Wickelt sich ein Objekt, das kann ein Wert sein oder ein (3rd party), dann-in der Lage, Versprechen in ein $q Versprechen. Dies ist nützlich, wenn Sie sind den Umgang mit einem Objekt, das möglicherweise oder möglicherweise nicht werden, ein Versprechen, oder wenn das Versprechen stammt aus einer Quelle, der man nicht Vertrauen.", d.h. es kann so etwas wie ein string in einem Versprechen -$.when("hello").then(function(response){ "hello" == response; });
.