我正在加载路线。它的模型 Hook 加载一些模型。有些是从 ember 存储中获取的,有些是通过 AJAX 请求的 promise :
model: function () {
return Em.RSVP.hash({
//the server data might not be loaded if user is offline (application runs using appcache, but it's nice to have)
someServerData: App.DataService.get(),
users: this.store.find('user')
});
}
App.DataService.get()
定义为:
get: function () {
return new Ember.RSVP.Promise(function(resolve, reject) {
//ajax request here
});
}
显然,如果请求被拒绝,流程就会中断,我根本无法显示页面。
有办法克服这个问题吗?
最佳答案
Ember.RSVP.hashSettled
正是为了这个目的。
来自 tildeio/rsvp.js Github 存储库:
hashSettled() work exactly like hash(), except that it fulfill with a hash of the constituent promises' result states. Each state object will either indicate fulfillment or rejection, and provide the corresponding value or reason. The states will take one of the following formats:
{ 状态:'已完成',值:值 }
或者
{ state: 'rejected', Reason: Reason }
这是使用它的示例( working JS Bin example ):
App.IndexRoute = Ember.Route.extend({
fallbackValues: {
firstProperty: null,
secondProperty: null
},
model: function() {
var fallbackValues = this.get('fallbackValues');
return new Ember.RSVP.Promise(function(resolve, reject) {
Ember.RSVP.hashSettled({
firstProperty: Ember.RSVP.Promise.resolve('Resolved data despite error'),
secondProperty: (function() {
var doomedToBeRejected = $.Deferred();
doomedToBeRejected.reject({
error: 'some error message'
});
return doomedToBeRejected.promise();
})()
}).then(function(result) {
var objectToResolve = {};
Ember.keys(result).forEach(function(key) {
objectToResolve[key] = result[key].state === 'fulfilled' ? result[key].value : fallbackValues[key];
});
resolve(objectToResolve);
}).catch(function(error) {
reject(error);
});
});
}
});
fallbackValues
对于管理解析哈希的属性的后备值非常有用,而无需在 Promise 函数中使用条件。
关于ember.js - 即使 Ember.js 模型 Hook 未加载所有 promise ,如何继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27407606/