Есть ли всегда обратный вызов для функции Ember.js. Then?

Предположим, у меня есть Ember obj. При выполнении какой-либо синхронизации с бэкэндом существует возможность использовать цепочку обещаний:

obj.save().then(function(res){
  // Success callback
}, function(res){
  // Fail callback
});

Есть ли завершенный/всегда обратный вызов для цепочки обещаний Ember.js с .then()?

Я попытался добавить третью функцию параметра, но это не помогло.

Ответ 1

http://emberjs.com/api/classes/Ember.PromiseProxyMixin.html#method_finally

Ember → jQuery

  • .then() → .done()
  • .catch() → .fail()
  • .finally() → . always()

Пример (в маршрутизаторе):

var self = this;
var modelType = this.store.createRecord('modelType', {/* model attrs */});

modelType.save().then(function(model){
  self.transitionTo('model.show', model);
}).catch(function(){
  console.log('Failure to Save: ', reason);
}).finally({
  self.hideSpinner()
});

Ответ 2

К сожалению, нет. Но вы можете создать свой собственный модификатор прототипа RSVP.Promise:

Ember.RSVP.Promise.prototype.always = function(func) {
  return this.then(func, func);
}

Итак, вы можете сделать следующее:

// will show success
Ember.RSVP.resolve('success').always(function(msg) { 
  alert(msg) 
})

// will show error
Ember.RSVP.reject('error').always(function(msg) { 
  alert(msg) 
})

Я надеюсь, что это поможет

Ответ 3

Ember использует библиотеку RSVP.js для promises, а RSVP не поддерживает always из-за того, что не является частью Promises/A (+).

Если вам это нужно, @wycats предлагает следующий подход:

Ember.RSVP.Promise.prototype.andThen = function(success, error, always) {
  return this.then(function(value) {
    var ret = success(value);
    always(value);
    return ret;
  }, function(reason) {
    var ret = error(reason);
    always(reason);
    return ret;
  });
};

Ответ 4

Решение gorner работает, но для Ember Data вам также нужно добавить следующее:

Ember.PromiseProxyMixin.reopen({
  andThen: function() {
    var promise = this.get('promise');
    return promise['andThen'].apply(promise, arguments);
  }
});

Причина в том, что функция DS.Model.save() возвращает a PromiseObject (см. http://emberjs.com/api/data/classes/DS.PromiseObject.html), которая не реализует Ember.RSVP.Promise но вместо этого реализует Ember.PromiseProxyMixin. Таким образом, вы должны сделать функцию andThen доступной в этом миксе, чтобы она работала с promises при сохранении моделей.