2013-09-25 48 views
10

假设我得到了Ember obj。在做任何类型的同步与后端存在使用一个承诺链成为了可能:Ember.js .then函数是否总是回调?

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

是否有一个做/总是回调与.then() Ember.js承诺链?

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

回答

10

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

烬 - >的jQuery

  1. 。然后() - > .done()
  2. .catch() - > .fail()
  3. 。最后() - >。总是()

实施例(在路由器):

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

这应该被标记为正确的答案。对我很好! – Pedro

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

灰烬使用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; 
    }); 
}; 
+0

不够公平,谢谢! – p1100i

+1

Ember有一个“finally”方法:http://emberjs.com/api/classes/Ember.PromiseProxyMixin.html#method_finally – Taysky

0

戈尔的解决方案作品,但为灰烬的数据,你必须添加下面还有:

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