2013-09-25 13 views
10

私はEmber objがあると仮定します。Ember.js .then関数には常にコールバックがありますか?

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

ありなさ/常に.then()とEmber.jsの約束チェーンのコールバック:バックエンドとの同期のいずれかの種類を行うときの約束チェーンを使用するpossiblityはありますか?

私は第3のパラメータ関数を追加しようとしましたが、それは役に立ちませんでした。

答えて

10

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

エンバー - > jQueryの

  1. .then() - >の.done()
  2. .catch() - > .fail()
  3. .finally() - (ルータ)> .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() 
}); 
+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ライブラリを使用することができます願っています、 Promises/A(+)仕様に含まれていないため、RSVP does not support alwaysが含まれています。

あなたがそれを必要とする場合は、@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()関数は、Ember.RSVP.Promiseを実装せず、代わりにEmber.PromiseProxyMixinを実装するPromiseObjecthttp://emberjs.com/api/data/classes/DS.PromiseObject.htmlを参照)を返します。だから、モデルを保存するときに約束して働くためには、そのmixinでandThen関数を利用できるようにしなければなりません。