10

我正在尝试从 2 个类别(新闻和事件)中获取两个获取 2 个博客文章列表,然后将它们显示在我主页的 2 个不同列中。我需要执行 2 次单独的 Ajax 调用来获取这些博客文章。我不使用 ember-data 进行此操作,因为我看不到在这种情况下使用它的优势(但我可能错了)。

export default Ember.Route.extend({
  setupController(controller, model) {
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category=';

    Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) {
      controller.set('news', data.posts);
    });
    Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) {
      controller.set('events', data.posts);
    });
  }
});

上面的代码有效。但是从我在 Ember 文档中读到的内容来看,我应该将这些数据放在model钩子中(而不是setupController)以利用 Promise。所以我尝试以这种方式重写我的代码:

export default Ember.Route.extend({
  model() {
    var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category=';

    return {
      news: function () {
        return Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }).then(function (data) {
          return data.posts;
        })
      },
      events: function () {
        return Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' }).then(function (data) {
          return data.posts;
        })
      }
    };
  }
});

但这不起作用。在页面呈现之后,Ajax 调用完成但为时已晚。我不确定我在做什么错。在这种情况下使用 ember-data 会有什么好处吗?

4

2 回答 2

13

你可以返回一个 Promises 的哈希值RSVP.hash()

你可以这样做:

export default Ember.Route.extend({
    model() {
        var wpUrl = 'http://public-api.wordpress.com/rest/v1/sites/company.wordpress.com/posts/?number=2&category=';

        return new Ember.RSVP.hash({
            news: Ember.$.ajax({ url: wpUrl + 'news', dataType: "jsonp", type: 'GET' }),
            events: Ember.$.ajax({ url: wpUrl + 'events', dataType: "jsonp", type: 'GET' })
        });
    }
});

在此处阅读有关 Ember 承诺的更多信息

于 2013-12-16T08:17:16.383 回答
2

您返回一个包含两个承诺的对象,而不是一个实际的承诺。你需要的是建立你自己的承诺(Ember.RSVP.Promise),一旦两个内部承诺都解决了,它就会被解决。

于 2013-09-24T08:01:09.363 回答