Lösen das Versprechen ein Objekt mit einem "dann" - Funktion
Dies ist eine etwas abstrakte Frage, denn ich habe nicht einen bestimmten use-case jetzt. Ich habe bemerkt, dass, wenn Sie lösen ein Versprechen ein Versprechen
var deferredA = $q.defer();
var deferredB = $q.defer();
deferredA.promise.then(function(result) {
//Will get here once promiseB has been resolved.
});
deferredA.resolve(deferredB.promise);
als promiseA nicht wirklich gelöst werden, bis die promiseB gelöst (und dann promiseA behoben ist mit dem Wert von promiseB Auflösung). Was aber, wenn ich wollte, zu beheben mit einem Wert ein Objekt mit einem "dann" - Funktion, wie:
var deferred = $q.defer();
deferred.promise.then(function(result) {
//Aim is to get here with result = {then:function(){}},
//as though I had resolved a promise with a non-promise value,
//but this function is never called
});
deferred.resolve({
then: function() {
}
});
dann promiseA eigentlich nie aufgelöst wird, als es davon ausgegangen, dass der Wert ist ein Versprechen, auch wenn in dem Beispiel oben ist es nicht wie in, es wurde nicht erstellt, mit $q.defer(). Es ist ein Beispiel plunkr bei
http://plnkr.co/edit/Z8XUKzxHtGBKBmgPed2q?p=preview
Gibt es eine Möglichkeit, um dieses? Wenn ja, wie?
Bearbeiten: geklärt latente/Versprechen & setzen Sie im Beispiel "dann" - callbacks.
Ziel ist es, in der Lage zu lösen, die Versprechen, mit ein Objekt mit einer "dann" - Funktion. Die Funktion nutzen wollen, die mit der aufgelösten Wert das Versprechen möglicherweise in einem ganz anderen Teil des Codes zu generieren + Lösung Versprechen, so dass ich nicht denke, das wäre wirklich möglich.
Hmm. Das ist interessant, dass es nicht erkennt eine Instanz von
$q.defer().promise
. Vielleicht ist das ein bug...InformationsquelleAutor Michal Charemza | 2013-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lösung
Den
then
Eigenschaft, die Sie übergeben überschreiben, das Versprechen istthen
Eigenschaft. Sie stattdessen wollen, um Ihr Objekt, von innerhalb der success-callback von der Winkelposition versprichtthen
Funktion wie diese:Mithilfe der oben genannten Ihre Nachricht wird nun aufgerufen und Sie können rufen Sie die
then
Funktion in Ihre Immobilie:Hier ist die aktualisierte arbeiten plunker.
Frage/Warum das funktioniert,
schauen wir uns die Winkel -
resolve()
:Blick auf
value = ref(val);
gefolgt vonvalue.then(callback[0], callback[1], callback[2]);
sehen wir, dass Winkel-legt denthen
- Funktion, um das Versprechen als eine Eigenschaft und dass das Objekt, das Sie übergeben, überschreibt diese Eigenschaft. Also, in deinem Fall die übergebenethen
Funktion aufgerufen wird, statt derdeferred.promise.then(function(result)...
.Aber Winkel ruft Ihre
then
Funktion mit den drei Rückrufe (Erfolg, Fehler, informieren):value.then(callback[0], callback[1], callback[2]);
gespeichert wurden, die aus invar callbacks = pending;
Also die Lösung ist der Anruf der erste "Erfolg" Rückruf in Ihrem
then
- Funktion auf und übergeben Sie Ihr Objekt einschließlich derthen
Immobilie, die Sie wollen zurück. Nun das Versprechen, diethen
aufgerufen und erhält Ihr Objekt einschließlich Ihrerthen
EigenschaftSind Sie auf der Suche nach gehören die
then
für ein anderes Versprechen? Oder Sie sind in diese rekursiv? Wo diethen
dass resolve () - Aufrufe enthält ein weiteresthen
Funktion für das gleiche Versprechen, und wenn ja, was wäre die Abbruch-Bedingung für die Rekursion?Ich denke, keiner von denen, die keine Rekursion. Es gibt einige asynchrone Aktion erzeugt ein Objekt, das enthält eine
then
Schlüssel, dessen Wert eine Funktion ist. Es könnten auch andere Schlüssel in das Objekt, wie pro meine vorherigen Kommentar. Das Ziel ist, verwenden Sie dieses Objekt als vollständig gelöst Wert ein Versprechen. Sie können{'myResult1':'result1','myResult2':'result2'}
fein als gelöst Wert, aber sagen Sie einschließen möchtenthen
als auch die Funktion{'myResult1':'result1','myResult2':'result2','then':function() {}}
, dann wird halt die Versprechen, die jemals aufgelöst wird, wie pro die original plunkr.Vielen Dank - das hat geholfen. Ich aktualisierte die Antwort (und die plunker) und hoffentlich verbessert der Erklärung. Es ist schwierig zu erklären, da beide Ihre
then
Eigentum und die Eckigethen
Eigenschaft der Interaktion.Ich sehe es so: man macht das, was ich wollte. Danke!
InformationsquelleAutor KayakDave
Sagte Sie, dass {dann : function(){...}} ist das nicht ein Versprechen. Naja, entsprechend der Verheißung A+ spec tut es.
Spec-Staaten, die verspricht, sollen interoperabel sein, das heißt, wenn ein Versprechen sein gelöst mit einem thenable Objekt, oder wenn die onFulfill Rückruf der ein Versprechen gibt eine thenable. Das Versprechen zurück, dann Methode das erste Versprechen wird gelöst werden, sobald das Versprechen zurück, onFulfill oder als parameter übergeben, um die resolve-Methode aufgelöst wird.
So Ihr Versprechen, wird sich niemals auflösen, weil Sie Ihre thenable Objekt wird nie "gelöst" werden, und nie ruft seine onFulfill Rückruf.
Dass ist ein wenig verwirrend, aber mal sehen, auf Praxis.
Die deferred - Methode beheben wird sehen das dann die Methode von Ihrem Gegenstand und denkt: "uhh, eine Schwester Versprechen, ich wird aufgelöst, sobald es bekommt zuerst".
So ruft Ihr dann die Funktion mit einem callback, um tatsächlich zu lösen Ihr Versprechen.
diese Weise:
Ich weiß nicht, warum Sie dies tun, aber Sie sollten ' N ' lösen ein Versprechen mit thenable.
Sie können denken, in einem anderen Wege zu erreichen, was Sie wollen.
Hier ist die einfachste, die ich denken kann:
Die resolve-Methode wird bei der Suche nach einer then-Methode, aber jetzt ist das Objekt nicht ein thenable, der index 0 des Arrays ist.
Aber wieder, Sie sollten wirklich zweimal überlegen, bevor Sie weitermachen.
InformationsquelleAutor pedroassis
Ich habe kommen zu dem Schluss, dass es nicht möglich ist.
Sie können nur sicherstellen, dass Sie nicht haben
then
Eigenschaft durch das umschließen des Objekts in ein anderes Objekt, ohne eine:InformationsquelleAutor Vanuan