【问题标题】:Catching a Promise exception and returning a default value捕获 Promise 异常并返回默认值
【发布时间】:2015-03-12 06:23:27
【问题描述】:

如果 promise 发生异常,我想返回默认值。我返回的数组似乎无法正常工作。

我的路线模型挂钩

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'),

【问题讨论】:

  • 我不确定,但在这种情况下可能会触发拒绝 (...then(func(){}, func(){.. denied ...})?
  • @EntspAndi 我不关注。您是否建议在 .catch() 之后使用 .then()?
  • @EntspAndi 我想我现在明白你的意思了。 .then() 接受两个函数,成功和失败。我试过了,但得到了相同的结果。从失败钩子返回时。

标签: ember.js rsvp.js


【解决方案1】:

您可以通过返回 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2018-01-14
    • 1970-01-01
    相关资源
    最近更新 更多