9

我一直在尝试编写一个代码示例来了解承诺。但我似乎无法弄清楚如何处理回调并稍后获得“thenable”值。

这是我正在研究的两个相关 JSBin 示例。以冗长的风格编写,以模仿烘焙饼干。

没有异步的 Ember JS

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

显示基本行为的纯同步示例(故意使用基本对象模型)

带有异步和承诺的 Ember JS

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

尝试扩展第一个示例并实现延迟完成的方法并稍后返回一个已履行的承诺对象。

试图理解的概念:

  • 如何正确处理承诺,特别是 Ember.RSVP.Promise 并稍后获取对象。
  • 如何使用 Ember.run.later 方法而不是 setTimeout
4

1 回答 1

14

如何正确处理承诺,特别是 Ember.RSVP.Promise 并稍后获取对象

似乎你已经接近解决这个问题了,只需要对你的 jsbin 做一些小改动就可以了:

首先,与其将Promise推送到您的数组中,不如将 Promise 传递给then回调的值推送。真的在这种情况下,你根本不需要那个 promise 对象。所以:

// 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 中的错误。在原始版本中,promise 被拒绝,因为条件测试总是评估为 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

如何使用 Ember.run.later 方法而不是 setTimeout

它们基本上是一样的。你似乎正确地使用它。

于 2013-08-18T06:24:08.073 回答