ember.js - 即使 Ember.js 模型 Hook 未加载所有 promise ,如何继续?

标签 ember.js

我正在加载路线。它的模型 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/

相关文章:

ember.js - 一起请求两个模型

javascript - Ember RSVP.Promise 解析函数返回未定义

javascript - 如何通过外部脚本更改当前模板/路由?

javascript - 异步关系上的 Ember 数据计算属性

javascript - 如何将对象中 emberjs 变量的值附加到我的 anchor 标记 href?

javascript - Ember 计算属性不适用于服务器数据

twitter-bootstrap - 在 Ember.JS ember-cli app 中使用 Bootstrap 的 LESS 源的推荐方式

ruby-on-rails - Rails 4.2 - 葡萄 - IOError : Not opened for reading

jquery - 替换绑定(bind)数组中的元素会在没有它的情况下短暂呈现它

ruby-on-rails - 使用JSONAPI适配器从Emberjs发布到Rails,Rails看不到参数