2013-08-18 8 views
9

Я пытался работать над примером кода, чтобы получить голову от обещаний. Но я не могу понять, как бороться с обратными вызовами и получить «последующее» значение позже.Попытка понять Ember JS обещания

Вот два соответствующих примера JSBin, над которыми я работаю. Написано в многословном стиле, чтобы подражать пекарне.

Ember JS без асинхронной

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

чисто синхронный пример, чтобы показать основное поведение (намеренно используя базовую модель объекта)

Ember JS с асинхронным и обещает

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

Попытайтесь расширить первый пример и реализовать метод, когда все выполняется с задержкой и возвращает выполненный объект обещания позже.

Концепции, пытающиеся понять:

  • Как правильно обрабатывать обещания и, в частности Ember.RSVP.Promise и получить объект позже.
  • Как использовать метод Ember.run.later вместо SetTimeout

ответ

14

Как правильно обрабатывать обещания и конкретно Ember.RSVP.Promise и получить объект позже

Кажется, как вы близки к тому, чтобы это понять, просто нужно было внести некоторые незначительные изменения в ваш jsbin, чтобы заставить все работать:

Прежде всего, вместо того, чтобы нажимать , обещание на yo ur, вы должны нажать значение, которое обещание переходит к обратному вызову then. Действительно, в этом случае вам вообще не нужен этот объект обещания. Итак:

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

Второе изменение состояло в том, чтобы исправить ошибку в cookieSlowBake. В первоначальной версии обещание отклоняется из-за условного теста, который всегда будет оцениваться как ложный, поскольку он не был в обратном вызове Ember.run.later. Новая версия избавляется от условного и просто решает обещание, когда обратный вызов выполняется.

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

Смотреть работать jsbin здесь: http://jsbin.com/ebOBEk/1/edit

Как использовать метод Ember.run.later вместо SetTimeout

Они в основном то же самое. Вы, кажется, используете его правильно.

+0

Майк большое спасибо. Ваш пример имеет смысл. Таким образом, «ценность» - это обещанное обещание, и я просто должен справиться с этим. Однако то, что меня смущает, - это то, как обращаться с thennable с другой функцией. например почему эти два примера не работают http: // jsbin.com/omIZeq/1/edit, используя «this» http://jsbin.com/omIZeq/2/edit, используя «значение» –

+0

Рад, что помогло. Поэтому для обработки thennable с fx просто передайте fx в качестве аргумента. Проблема с первым jsbin заключается в том, что вместо передачи fx как arg он выполняет fx и передает его результат как arg. Поэтому вместо 'cookiePromise.then (App.cookieDeliveredSuccessfully (this), App.cookieNotDelivered (this));' it должно быть 'cookiePromise.then (App.cookieDeliveredSuccessfully, App.cookieNotDelivered);' –

+0

Ahhhh ok. Поэтому я предполагаю, что внутренняя реализация функции then передает аргумент за кулисами. Наверное, потому что я не видел что-то между фигурными скобками, его там не было. Теперь экспериментируйте с целым рядом обещаний. Благодаря! –