Ember.js 以异步方式在一个路由中获取 2 个嵌套模型

Ember.js get 2 nested models in one route in asynchronous way

我有 2 次对服务器的调用,调用时间很长(10-20 秒)。在第一个请求(无关紧要)完成后,我需要在页面上更新信息。第二次请求完成后 - 我还需要更新部分页面。

怎么实现,因为我试过用Promises实现

App.IndexRoute = Ember.Route.extend({
    model: function(){
      return Ember.$.getJSON('url').then(firstMethod).then(secondMethod)
    }
})

但是不行,因为secondMethod会在firstMethod结束后执行。

我也试过使用这个代码:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return Ember.RSVP.hash({
      first_data: Ember.$.getJSON('url1'),
      second_data: Ember.$.getJSON('url2') 
    });
  }
});

但我有同样的问题 - 数据将在 2 次调用完成后 return。

如何运行异步这2个请求并独立更新页面上的部分数据?

我会使用 PromiseProxyMixin 创建对象代理,这些代理将在您的承诺解决时自动更新。像这样:

model: function() {
    return Ember.Object.create({
        first_data: Ember.ObjectProxy.createWithMixins(Ember.PromiseProxyMixin, {
            promise: Ember.$.getJSON('url1')
        }),
        second_data: Ember.ObjectProxy.createWithMixins(Ember.PromiseProxyMixin, {
            promise: Ember.$.getJSON('url2')
        })
    });
}

Ember 将监视您的模型和两个数据属性以获取更新。在承诺得到解决之前,每个 属性 请求都会 return undefined。但是当承诺解决时,PromiseProxyMixin 将触发对代理的更新,这将反过来触发对您正在观看的所有属性的更新。