使用异步回调进行反序列化

时间:2012-06-28 12:43:42

标签: ember.js

我重写了反序列化方法,所以我可以从后端加载一个与id对应的对象。但是,我获取此对象的方式是异步的。反序列化不会等待我的回调并自动返回。

示例:

show: Em.Route.extend({
        route: "/:id",
        deserialize: function(router, post) {
            var postController = router.get('postController ');
            postController.findById(post.id, function(post) {
                return post
            });
        }

调用后端,但反序列化会自动返回。有没有办法在反序列化中使用异步调用?

谢谢

3 个答案:

答案 0 :(得分:3)

卢克·梅利亚(Luke Melia)通过jQuery Deferred对象使用Promises在这件事上做了纽约Ember聚会闪电演讲。基本上,Ember会检测您是否返回Promise(通过查看对象是否具有then方法),并将路由置于loading状态(您必须将其声明为状态的兄弟)反序列化)。在ajax.done上,您可以解析承诺,使路由器完全处于数据完全加载的状态。

使用新的路由器,你真的不应该使用对vanilla statemanager中存在的异步转换的支持,但你可以使用自动加载状态来实现同样的事情。

答案 1 :(得分:0)

以下是我发现的内容,这适用于旧版本的ember:

在州/路线的输入功能中,您可以尝试加载数据。 enter函数作为第二个参数接收转换对象,它有2个方法。一个是'异步',告诉过渡它不能继续,直到另一个方法'resume'有bean调用。

所以在示例中:

    ...
    enter: function (r, t) {
           t.async();
           r.get('postController').loadResources(t.resume);
    },
    ...

答案 2 :(得分:0)

对于较新版本的Ember,您应该为您加载的数据使用某种代理。

    {
      PostController: Ember.ObjectController.extend({
          find: function (id) {
              var ajax = Em.$.ajax(); //call the ajax thing
              ajax.done(Em.$.proxy(function (data) {
                  this.set('content', data);
              }, this));
              return this;
          }
      })
      ...
      Router: Em.Router.extend({
          show: Em.Route.extend({
              deserialize: function(router, post) {
                  var postController = router.get('postController');
                  postController.find(post.id);
                  return postController;
              }
          });
      })
    }