2013-08-18 6 views
9

Ich habe versucht, an einem Codebeispiel zu arbeiten, um meinen Kopf Versprechen zu bekommen. Aber ich kann nicht herausfinden, wie ich mit den Callbacks umgehen soll, und später den "thenable" -Wert erhalten.Versuchen zu verstehen Ember JS verspricht

Hier sind zwei relevante JSBin-Beispiele, an denen ich gerade arbeite. In ausführlichen Stil geschrieben, um Kekse zu emulieren.

Ember.js ohne async

http://jsbin.com/iSacev/1/edit

rein synchrones Beispiel das Grundverhalten zeigen

Ember.js mit async und verspricht

(absichtlich Grundobjektmodell) http://jsbin.com/udeXoSE/1/edit

Es wurde versucht, das erste Beispiel und die implementierte Methode so zu erweitern, dass Dinge mit einer Verzögerung ausgeführt werden und später ein erfülltes Zusicherungsobjekt zurückgegeben wird.

Konzepte zu verstehen versuchen:

  • Wie man richtig Versprechen behandeln und speziell Ember.RSVP.Promise und später ein Objekt erhalten. statt SetTimeout
  • Wie die Ember.run.later Methode verwenden

Antwort

14

Wie man richtig Versprechen behandeln und speziell Ember.RSVP.Promise und erhalten ein Objekt später

scheint, wie Sie sind kurz davor, das herauszufinden, musste nur ein paar kleine Änderungen an Ihrem jsbin machen, um Dinge zum Laufen zu bringen:

Zuerst, anstatt das Versprechen auf yo zu schieben Ihr Array sollten Sie den Wert, den das Versprechen an den Rückruf then übergibt. Wirklich, in diesem Fall brauchen Sie dieses Versprechensobjekt überhaupt nicht. Also:

// Call the then function on the promise 
App.cookieSlowBake(cookie).then(function(value) { 
    alert("Your slow baked cookies are ready to eat"); 
    App.CookieStore.pushObject(value); 
}, function(value) { 
    // failure 
    alert("Something happened with the oven sorry no cookies."); 
}); 

Zweite Änderung war es, einen Fehler in CookieSlowBake zu beheben. In der ursprünglichen Version wurde das Versprechen wegen eines bedingten Tests abgelehnt, der immer als falsch bewertet wurde, da es sich nicht um den Callback von Ember.run.later handelte. Die neue Version beseitigt das bedingte und löst nur das Versprechen, wenn der Rückruf abgeschlossen ist.

var bakedCookiePromise = new Ember.RSVP.Promise(function(resolve, reject){ 
    var bakeTime = 2000; // milliseconds 
    var bakedCookie = false; 
    Ember.run.later(cookieDough, function() { 
    // code here will execute within a RunLoop in about the bakeTime with this == cookieDough 
    cookieDough.set('deliveryStatus', "cookie delivered later after baking " + bakeTime); 
    bakedCookie = true; 
    resolve(cookieDough); 
    }, bakeTime); 
}); 

Siehe Arbeits jsbin hier: http://jsbin.com/ebOBEk/1/edit

Wie die Ember.run.later Methode verwenden, statt SetTimeout

Sie sind im Grunde das gleiche. Sie scheinen es richtig zu benutzen.

+0

Mike vielen Dank. Ihr Beispiel macht Sinn. Also ist "Wert" das erfüllte Versprechen und ich muss es einfach handhaben. Was mich jedoch verwirrt, ist, wie man das thenable mit einer anderen Funktion behandelt. z.B. Warum funktionieren diese beiden Beispiele nicht http: // jsbin?com/omIzeq/1/bearbeiten mit "dies" http://jsbin.com/omIZeq/2/edit mit "Wert" –

+0

Froh, dass geholfen hat. Um mit einem fx zu arbeiten, übergeben Sie einfach diesen fx als Argument. Problem mit der ersten jsbin ist, dass statt fx als arg fx ausgeführt wird und sein Ergebnis als arg übergeben wird. Also statt 'cookiePromise.then (App.cookieDeliveredSuccessfully (this), App.cookieNotDelivered (this));' sollte es 'cookiePromise.then (App.cookieDeliveredSuccessfully, App.cookieNotDelivered) sein;' –

+0

Ahhhh ok. Also nehme ich an, die interne Implementierung der then-Funktion übergibt das Argument hinter die Kulissen. Ich schätze, weil ich zwischen geschweiften Klammern nichts gesehen habe, war es nicht da. Jetzt experimentieren mit Verkettung mehrerer Versprechen. Vielen Dank! –