捕获 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 [];
        })
    });
  }
});

然后观察 menuItemslength 属性 如下:

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