2013-09-25 17 views
10

Suppongo di avere una brace obj. Quando fare qualsiasi tipo di sincronia con back-end v'è una possibilità di ricorso una catena promessa:Esiste sempre un callback per la funzione Ember.js .then?

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

C'è un fatto/richiamata sempre per Ember.js catena promessa con .then()?

Ho provato ad aggiungere una terza funzione parametro, ma non è stato di aiuto.

risposta

10

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

Ember -> jQuery

  1. .then() -> .done()
  2. .catch() -> .fail()
  3. .Infine() - > .sempre()

Esempio (nel 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

Questo dovrebbe essere contrassegnato come risposta corretta. Funziona alla grande per me! – Pedro

3

Purtroppo non c'è. Ma è possibile creare il proprio modificando il prototipo RSVP.Promise:

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

in modo da poter effettuare le seguenti operazioni:

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

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

Spero che aiuta

2

Ember utilizza la libreria RSVP.js di promesse, e RSVP does not support always per non far parte delle specifiche Promises/A (+).

Se ne avete bisogno, @wycats suggerisce le following approach:

lavori soluzione
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

Abbastanza giusto, grazie! – p1100i

+1

Ember ha un metodo "finalmente": http://emberjs.com/api/classes/Ember.PromiseProxyMixin.html#method_finally – Taysky

0

del Gorner, ma per Ember dati è necessario aggiungere le seguenti così:

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

La ragione è che il La funzione DS.Model.save() restituisce PromiseObject (vedere http://emberjs.com/api/data/classes/DS.PromiseObject.html), che non implementa Ember.RSVP.Promise ma implementa invece Ember.PromiseProxyMixin. Quindi devi rendere disponibile la funzione andThen in quel mixin affinché funzioni con promesse quando salvi i modelli.

Problemi correlati