对于一个特定的服务电话,我使用的,而不是烬数据的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