我有一条如下所示的路线,它从多个休息调用中构建数据。
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 返回的数据必须设置为模型对象,如上面所示。
此外,可能还会有一些休息调用需要来自其他休息调用的数据。我还有其他方法可以处理这个 promise 吗?
PS:单条路线立即需要数据
最佳答案
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,该 Promise 在您调用解析之前不会解析。
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;
},
关于ember.js - 从多个剩余调用构建模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20543802/