How to proceed even if the Ember.js model hook does not load all the promises?

I am loading the route. His model hook loads some models. Some of them are retrieved from the ember repository, and some of them promises are requested through AJAX:

model: function () {
        return Em.RSVP.hash({
            //the server data might not be loaded if user is offline (application runs using appcache, but it nice to have)
            someServerData: App.DataService.get(),
            users: this.store.find('user')
        });

    }

App.DataService.get() defined as:

get: function () {
    return new Ember.RSVP.Promise(function(resolve, reject) {   
      //ajax request here
    });
}

Obviously, if the request is rejected, the flow is interrupted, and I cannot display the page at all.

Is there any way to overcome this?

+4
source share
2 answers

Whereas it is Ember.RSVP.hashSettlednot available in my version of Ember. I came up with the following solution:

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')
                });
            });
        }); 
      }
0
source

Ember.RSVP.hashSettled for this purpose.

From tildeio / rsvp.js Github Repository:

hashSettled() , hash(), , promises '. , . :

{ state: 'fulfilled', value: value } { state: 'rejected', reason: reason }

( JS Bin):

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 - .

+2

All Articles