2013-08-18 9 views
9

Próbowałem pracować nad przykładem kodu, aby zrozumieć moje obietnice. Ale nie potrafię wymyślić, jak radzić sobie z wywołaniami zwrotnymi i później uzyskać "możliwą" wartość.Próba zrozumienia obietnicy Ember JS

Oto dwa istotne przykłady JSBin, nad którymi pracuję. Napisane w pełnym stylu, aby emulować pieczenie ciasteczek.

ember.js nie asynchronicznie

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

całkowicie synchronicznej celu pokazania podstawowych zmienić (celowo za pomocą podstawowego modelu obiektu)

ember.js z asynchronicznego obiecuje

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

Próba przedłużenia pierwszego przykładu i implementacji metody, gdy rzeczy są wykonywane z opóźnieniem i zwraca spełniony obiekt obietnicy w późniejszym terminie.

koncepcje próbujące zrozumieć:

  • Jak prawidłowo obsługiwać obietnic i specjalnie Ember.RSVP.Promise i uzyskać obiekt później.
  • Jak stosować metodę Ember.run.later zamiast setTimeout

Odpowiedz

14

Jak prawidłowo obsługiwać obietnice a konkretnie Ember.RSVP.Promise i uzyskać obiekt później

Wygląda jak ty jesteście bliscy tego, że to wymyśliliście, musieliśmy wprowadzić pewne drobne zmiany w waszym jsbina, aby wszystko działało:

Po pierwsze, zamiast przesuwać obietnicę obietnicę na yo tablica ur powinna przekazać wartość, którą obietnica przechodzi do wywołania zwrotnego then. Naprawdę w tym przypadku nie potrzebujesz w ogóle tego obiektu obietnic. A więc:

// 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."); 
}); 

Druga zmiana polegała na naprawieniu błędu w cookieSlowBake. W wersji oryginalnej obietnica została odrzucona z powodu warunkowego testu, który zawsze byłby fałszywy, ponieważ nie był on w wywołaniu zwrotnym Ember.run.later. Nowa wersja pozbywa się warunkowego i po prostu rozwiązuje obietnicę, gdy wywołanie zwrotne zostanie wykonane.

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); 
}); 

Zobacz pracuje jsbin tutaj: http://jsbin.com/ebOBEk/1/edit

Jak stosować metodę Ember.run.later zamiast setTimeout

Są to w zasadzie to samo. Wydaje się, że używasz go poprawnie.

+0

Mike dziękuję bardzo. Twój przykład ma sens. Tak więc "wartość" jest spełnioną obietnicą i po prostu muszę sobie z nią poradzić. Jednak to, co jest dla mnie mylące, polega na tym, jak radzić sobie z wersją z inną funkcją. na przykład dlaczego te dwa przykłady nie działają http: // jsbin.com/omIZeq/1/edit za pomocą "tego" http://jsbin.com/omIZeq/2/edit przy użyciu "wartości" –

+0

Cieszę się, że pomógł. Aby poradzić sobie z opcją fx, wystarczy podać ten argument jako argument. Problem z pierwszym jsbin polega na tym, że zamiast podawać fx jako arg, wykonuje on fx i przekazuje wynik jako arg. Więc zamiast 'cookiePromise.then (App.cookieDeliveredSuccessfully (this), App.cookieNotDelivered (this));' powinno to być 'cookiePromise.then (App.cookieDeliveredSuccessfully, App.cookieNotDelivered);' –

+0

Ahhhh ok. Zakładam więc, że wewnętrzna implementacja funkcji wtedy przekazuje argument za kulisami. Chyba dlatego, że nie widziałem czegoś między nawiasami klamrowymi, tego nie było. Teraz eksperymentuj z łańcuchem wielu obietnic. Dzięki! –

Powiązane problemy