對於一個特定的服務電話,我使用的,而不是燼數據的jQuery:在Ember中進行異步調用的正確方法是什麼?
return Ember.$.get(url).then((json) => {
this.store.pushPayload('user', json);
return this.store.getById('user', json.user.id);
});
這打破Ember的測試:
Uncaught Error: Assertion Failed: You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in a run
我可以通過增加自己的諾言的。然後內部運行解決這個問題功能:
return Ember.$.get(url).then((json) => {
Ember.run(() => {
this.store.pushPayload('user', json);
return this.store.getById('user', json.user.id);
})
});
這不適合我的工作,雖然,因爲Ember.run(..)不返回任何東西,所以我的諾言解析爲未定義。我看到了一些建議,將Ember.run移出一個級別,以便它包裝返回承諾的方法。這將返回正確的值,但測試將繼續失敗。
什麼是正確的方式來返回一個可以解析爲一個值的承諾,同時不會破壞測試?
謝謝!
編輯1
我沒有得到它與此代碼的工作:
var self = this;
return Ember.$.get(url).then((json) => {
return new Ember.RSVP.Promise(function(resolve, reject) {
Ember.run(function() {
self.store.pushPayload('user', json);
var user = self.store.getById('user', json.user.id);
debugger;
resolve(user);
});
});
});
這是做正確的方式?這只是爲了做一個Ajax調用而增加複雜性的感覺。
請不要在$ .get中使用'Ember.RSVP.resolve',而不是創建一個明確的新promise。 –
這不適合我。 store.pushPayload不會返回值,因此該快捷方式不起作用。此外它仍然絆倒測試。我確實得到了它的工作(請參閱編輯),但我不確定基於@Benjamin Gruenbaum的評論是否正確。 – Dennis