捕获 Promise 异常并返回默认值
Catching a Promise exception and returning a default value
我遇到一个问题,如果承诺发生异常,我想 return 默认值。我的数组 return 似乎不能正常工作。
我的路线模型挂钩
model: function() {
return {
menuItems : this.store.find('menuItem').catch(function(error) {
Ember.Logger.error('Retrieving Menu Items', error);
return [];
}),
我的控制器模式
selectFirstMenuItem: function() {
var model = this.get('model');
//At this point model.menuItems is some weird object
//with an _id : 26, _label : undefined, _result: Array(0), _state : 1 etc.
//(maybe a Promise?), the .get method throws an undefined exception.
if(model.menuItems.get('length') > 0 ) {
...
}
}.observes('model.menuItems.@each'),
您可以通过返回 Ember.RSVP.hash
而不是包含承诺的常规对象来完成这项工作,如下所示:
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.RSVP.hash({
menuItems: this.store.find('menuItem').then(
function(menuItems){ return menuItems; },
function(error) {
Ember.Logger.error('Retrieving Menu Items', error);
return [];
})
});
}
});
然后观察 menuItems
的 length
属性 如下:
App.IndexController = Ember.ObjectController.extend({
menuItemsObserver: function() {
var menuItems = this.get('model.menuItems');
var nonZeroLength = Ember.get(menuItems, 'length');
if(nonZeroLength ) {
console.log("The length is NOT zero");
}
else {
console.log("The length is zero");
}
}.observes('model.menuItems.length')
});
工作示例here
我遇到一个问题,如果承诺发生异常,我想 return 默认值。我的数组 return 似乎不能正常工作。
我的路线模型挂钩
model: function() {
return {
menuItems : this.store.find('menuItem').catch(function(error) {
Ember.Logger.error('Retrieving Menu Items', error);
return [];
}),
我的控制器模式
selectFirstMenuItem: function() {
var model = this.get('model');
//At this point model.menuItems is some weird object
//with an _id : 26, _label : undefined, _result: Array(0), _state : 1 etc.
//(maybe a Promise?), the .get method throws an undefined exception.
if(model.menuItems.get('length') > 0 ) {
...
}
}.observes('model.menuItems.@each'),
您可以通过返回 Ember.RSVP.hash
而不是包含承诺的常规对象来完成这项工作,如下所示:
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.RSVP.hash({
menuItems: this.store.find('menuItem').then(
function(menuItems){ return menuItems; },
function(error) {
Ember.Logger.error('Retrieving Menu Items', error);
return [];
})
});
}
});
然后观察 menuItems
的 length
属性 如下:
App.IndexController = Ember.ObjectController.extend({
menuItemsObserver: function() {
var menuItems = this.get('model.menuItems');
var nonZeroLength = Ember.get(menuItems, 'length');
if(nonZeroLength ) {
console.log("The length is NOT zero");
}
else {
console.log("The length is zero");
}
}.observes('model.menuItems.length')
});
工作示例here