从多个休息调用构建Model对象

时间:2013-12-12 12:37:42

标签: ember.js rsvp.js

我有一条如下路线,它从多个休息电话中构建数据。

App.IndexRoute = Ember.Route.extend({
  model: function() {
      var id = 1; //will get as url param later
      var modelData = {ab:{},ef:{}};
        return ajaxPromise('https://url1/'+ id +'?order=desc').then(function(data){
            modelData.ab = data.items[0];
            return ajaxPromise('https://url2/'+ id +'/?order=desc').then(function(data){
                modelData.ab.x = data.items;
                return modelData;
            })
        });
    }
});

我的ajaxPromise功能如下:

var ajaxPromise = function(url, options){
  return Ember.RSVP.Promise(function(resolve, reject) {

    var options = options || {
        dataType: 'jsonp',
        jsonp: 'jsonp'
    };

    options.success = function(data){
      resolve(data);
    };

    options.error = function(jqXHR, status, error){
      reject(arguments);
    };

    Ember.$.ajax(url, options);
  });
};

现在问题是我知道我可以将RSVP.all与promise实例一起使用,但是从这些url返回的数据必须设置为上面的模型对象。

此外,可能还有一些休息呼叫需要来自其他休息呼叫的数据。有没有其他方法可以处理这个承诺。

PS:单条路线需要立即数据

1 个答案:

答案 0 :(得分:3)

App.IndexRoute = Ember.Route.extend({
  model: function() {
      var id = 1; //will get as url param later
      return Ember.RSVP.hash({
        r1: ajaxPromise('https://url1/'+ id +'?order=desc'),
        r2: ajaxPromise('https://url2/'+ id +'/?order=desc')
      });
   },
  setupController:function(controller, model){
    model.ab = model.r1.items[0];
    model.ab.x = model.r2.items;
    this._super(controller, model);
  }
);

如果您有两个必须同步运行(第二个依赖于第一个),您可以创建自己的承诺,直到您致电解决后才能解决。

   model: function() {
      var promise = new Ember.RSVP.Promise(function(resolve, reject){
        var modelData = {ab:{},ef:{}};
        ajaxPromise('https://url1/'+ id +'?order=desc').then(function(data){
          modelData.ab = data.items[0];
          ajaxPromise('https://url2/'+ id +'/?order=desc').then(function(data){
            modelData.ab.x = data.items;
            resolve(modelData);
          })
        });
      });
     return promise;
   },