我一直在尝试一个代码示例,以达成我的承诺.但是我似乎无法弄清楚如何处理回调并且稍后得到“可调用”值.
这是我正在处理的两个相关的JSBin示例.以详细的风格写成模拟烘烤饼干.
Ember JS没有异步
http://jsbin.com/iSacev/1/edit
纯粹的同步示例来显示基本行为(故意使用基本对象模型)
Ember JS与异步和承诺
http://jsbin.com/udeXoSE/1/edit
尝试扩展第一个示例和实现方法,其中事情完成了一个延迟,并在以后返回一个履行的承诺对象.
试图理解的概念:
>如何正确处理承诺,特别是Ember.RSVP.Promise并在以后获取一个对象.
>如何使用Ember.run.later方法而不是setTimeout
解决方法
How to properly handle promises and specifically Ember.RSVP.Promise and get an object later
似乎像你这样想出来,只需要对你的jsbin做一些微小的改变来使事情发挥作用:
首先,不要将承诺推到你的阵列上,你应该将承诺的价值推到这个回调.真的在这种情况下,你根本不需要这个承诺对象.所以:
// 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中修复bug.在原始版本中,承诺被拒绝,因为有条件测试总是评估为false,因为它不在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
How to use the Ember.run.later method instead of setTimeout
他们基本上是一回事.你似乎正确使用它.