2015-06-12 70 views
1

對於一個特定的服務電話,我使用的,而不是燼數據的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調用而增加複雜性的感覺。

回答

0

將您的異步呼叫包裝在Ember.RSVP.Promise中,然後resolve。實施例(從截取的routemodel鉤):

var self = this; 
return new Ember.RSVP.Promise(function(resolve, reject) { 
    Ember.$.get(url).then((json) => { 
     var record = self.store.pushPayload('user', json); 
     Ember.run(null, resolve, record); 
     return record; 
    }); 
}); 
+0

請不要在$ .get中使用'Ember.RSVP.resolve',而不是創建一個明確的新promise。 –

+0

這不適合我。 store.pushPayload不會返回值,因此該快捷方式不起作用。此外它仍然絆倒測試。我確實得到了它的工作(請參閱編輯),但我不確定基於@Benjamin Gruenbaum的評論是否正確。 – Dennis

0

編輯:

看起來像在灰燼1.13+,做了Ajax的首選方法是使用Ajax的灰燼 - https://github.com/ember-cli/ember-ajax


由於您只是使用jQuery的$.ajax方法,您應該使用實際包含在所有使用ember-cli創建的新Ember項目中的「ic-ajax」庫。

這個庫基本上完成了在Ember.run中對JQuery Ajax調用的所有包裝,因此您可以輕鬆進行測試。

例如,使用你的例子:

import Ember from 'ember' 
.... 
.... 
return Ember.$.get(url).then((json) => { 
    this.store.pushPayload('user', json); 
return this.store.getById('user', json.user.id); 
}); 

將成爲

import Ember from 'ember' 
import request from 'ic-ajax' 
.... 
.... 
return request(url).then((json) => { 
    .... 
}); 

不必自己包裝你所有的Ajax調用Ember.run

+0

它看起來像ember-ajax現在建議不要使用ic-ajax。 – Dennis

+0

是的,在帖子的頂部添加了一個鏈接到ember-ajax回購的鏈接 – lholmquist

相關問題