【问题标题】:Building Model object from multiple rest calls从多个休息调用构建模型对象
【发布时间】:2013-12-12 12:37:41
【问题描述】:

我有一条路线,如下所示,它从多个休息调用中构建数据。

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:单条路线马上需要数据

【问题讨论】:

    标签: ember.js rsvp.js


    【解决方案1】:
    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);
      }
    );
    

    如果你有两个必须同步运行(第二个取决于第一个),你可以创建自己的 Promise,直到你调用 resolve 才会解析。

       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;
       },
    

    【讨论】:

    • 哇..真棒..顺便说一句,还有一个疑问没有被清除..有一些休息电话应该等待其他休息电话的结果..我该如何处理?
    • 创建你自己的承诺,见上文。
    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多