2013-09-25 3 views
10

Załóżmy, że mam Embera obj. Podczas wykonywania jakiejkolwiek synchronizacji z backend jest możliwośc korzystania łańcuch obietnicyCzy istnieje zawsze oddzwonienie do pliku Ember.js. Then?

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

Czy istnieje zrobione/zawsze callback dla ember.js łańcucha obietnicę .then()?

Próbowałem dodać trzecią funkcję parametru, ale to nie pomogło.

Odpowiedz

10

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

Ember -> jQuery

  1. .then() -> .done()
  2. .catch() -> .fail()
  3. .finally() - > .always()

(na przykład router):

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

To powinno być oznaczone jako poprawna odpowiedź. Działa doskonale dla mnie! – Pedro

3

Niestety nie ma. Ale można stworzyć swój własny modyfikujący prototyp RSVP.Promise:

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

Więc można wykonać następujące czynności:

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

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

Mam nadzieję, że to pomaga

2

Ember używa biblioteki RSVP.js na obietnicach, i RSVP does not support always z powodu nie bycia częścią specyfikacji Promises/A (+).

Jeśli jest to potrzebne, @wycats sugeruje following approach:

prace rozwiązanie
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

Wystarczająco fair, dzięki! – p1100i

+1

Ember ma metodę "finally": http://emberjs.com/api/classes/Ember.PromiseProxyMixin.html#method_finally – Taysky

0

Görner jest znany, ale Ember danych trzeba dodać następujące także:

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

Powodem jest to, że Funkcja DS.Model.save() zwraca wartość PromiseObject (patrz http://emberjs.com/api/data/classes/DS.PromiseObject.html), która nie implementuje Ember.RSVP.Promise, ale zamiast tego implementuje Ember.PromiseProxyMixin. Musisz więc udostępnić funkcję andThen w tym mixinie, aby działała z obietnicami przy zapisywaniu modeli.