Ember 是否有总是回调.js .then 函数



假设我得到了一个余烬obj。在与后端进行任何类型的同步时,可以使用承诺链:

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

Ember 是否有完成/总是回调.js承诺链与.then()

我尝试添加第三个参数函数,但它没有帮助。

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

Ember -> jQuery

  1. .then() -> .done()
  2. .catch() -> .fail()
  3. .final() -> .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()
});

不幸的是没有。但是您可以创建自己的修改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) 
})

我希望它有所帮助

Ember 使用 RSVP.js 库来获取承诺,而 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;
  });
};

gorner 的解决方案有效,但对于 Ember Data,您还必须添加以下内容:

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

原因是 DS.Model.save() 函数返回一个 PromiseObject(见 http://emberjs.com/api/data/classes/DS.PromiseObject.html),它不实现Ember.RSVP.Promise而是实现Ember.PromiseProxyMixin。因此,您必须在该mixin中提供andThen函数,以便在保存模型时使其与promise一起使用。

最新更新