【问题标题】:How to continue even if Ember.js model hook doesn't load all promises?即使 Ember.js 模型钩子没有加载所有承诺,如何继续?
【发布时间】:2014-12-10 17:50:25
【问题描述】:

我正在加载路线。它的模型钩子加载一些模型。有些是从 ember 商店获取的,有些是通过 AJAX 请求的承诺:

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
    });
}

显然,如果请求被拒绝,流程就会中断,我根本无法显示页面。

有没有办法克服这个问题?

【问题讨论】:

  • 你总是可以在 setupController 钩子中加载它。提出请求,在解决时设置一些控制器变量,在拒绝时,逻辑地处理拒绝。在 Ember 中,虽然在模型钩子中获取数据(以及应用程序自动阻止您的承诺)是惯用的,但您可以(而且我经常这样做)发出在其他地方返回承诺的请求

标签: ember.js


【解决方案1】:

Ember.RSVP.hashSettled 正是为此目的。

来自 tildeio/rsvp.js Github 存储库:

hashSettled() 的工作方式与 hash() 完全相同,只是它使用组成 promise 的结果状态的哈希来实现。每个状态对象将指示履行或拒绝,并提供相应的值或原因。各州将采用以下格式之一:

{ state: 'fulfilled', value: value } 或者 { 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 版本不包含 Ember.RSVP.hashSettled
  • 您可以导入原始 RSVP (bower install -S rsvp)。然后你可以做return RSVP.hashSettled({ ... });
【解决方案2】:

考虑到 Ember.RSVP.hashSettled 在我的 Ember 版本中不可用。我想出了以下解决方案:

model: function(params) {
        var self = this;
        return new Em.RSVP.Promise(function(resolve, reject){
            // get data from server
            App.DataService.get().then(function(serverData) { //if server responds set it to the promise
                resolve({
                    serverData: serverData,
                    users: self.store.find('user')

                });
            }, function(reason){ //if not ignore it, and send the rest of the data
                resolve({
                    users: self.store.find('user')
                });
            });
        }); 
      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-09
    • 2014-01-14
    • 1970-01-01
    • 2015-10-04
    • 2011-07-28
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    相关资源
    最近更新 更多