Есть ли всегда обратный вызов для функции 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 при сохранении моделей.