是否总是回调Ember.js。然后函数?

时间:2013-09-25 11:23:45

标签: javascript ember.js

假设我得到了一个Ember obj。与后端进行任何类型的同步时,都有可能使用保证链:

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

对于.then()的Ember.js承诺链是否有完成/始终回调?

我已经尝试添加第三个参数功能,但它没有帮助。

4 个答案:

答案 0 :(得分:12)

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

Ember - > jQuery的

  1. .then() - > .done()
  2. .catch() - > .fail()
  3. .finally() - > 。总是()
  4. 示例(在路由器中):

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

答案 1 :(得分:3)

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

我希望它有所帮助

答案 2 :(得分:2)

Ember使用RSVP.js库进行承诺,而RSVP does not support always由于不属于Promises / A(+)规范。

如果您需要,@ wycats会建议following approach

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

答案 3 :(得分:0)

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函数,以便在保存模型时使用promises。