Ember.js 什么';在Ember中进行异步调用的正确方法是什么?
对于特定的服务调用,我使用jQuery而不是ember数据:Ember.js 什么';在Ember中进行异步调用的正确方法是什么?,ember.js,promise,ember-cli,Ember.js,Promise,Ember Cli,对于特定的服务调用,我使用jQuery而不是ember数据: return Ember.$.get(url).then((json) => { this.store.pushPayload('user', json); return this.store.getById('user', json.user.id); }); 这打破了余烬的测试: 未捕获错误:断言失败:您已打开测试模式,该模式禁用了运行循环的自动运行。 您需要在运行中包装任何具有异步副作用的代码 我可以通过在我的承
return Ember.$.get(url).then((json) => {
this.store.pushPayload('user', json);
return this.store.getById('user', json.user.id);
});
这打破了余烬的测试:
未捕获错误:断言失败:您已打开测试模式,该模式禁用了运行循环的自动运行。
您需要在运行中包装任何具有异步副作用的代码
我可以通过在我的承诺中添加运行来解决此问题。然后,函数:
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调用就增加了很多复杂性。将异步调用包装在一个thin
resolve
中。示例(取自路线
的模型
挂钩):
将异步调用包装为一个then
resolve
。示例(取自路线
的模型
挂钩):
编辑:
在Ember 1.13+中,使用Ajax的首选方法是使用Ember Ajax-
由于您只是在使用jQuery的
$.ajax
方法,因此应该使用“ic ajax”库,该库实际上包含在所有使用Ember cli创建的新Ember项目中
这个库基本上在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) => {
....
});
比必须在Ember中包装所有ajax调用要干净得多。自己运行EDIT:
在Ember 1.13+中,使用Ajax的首选方法是使用Ember Ajax-
由于您只是在使用jQuery的$.ajax
方法,因此应该使用“ic ajax”库,该库实际上包含在所有使用Ember cli创建的新Ember项目中
这个库基本上在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中要干净得多。自己运行,现在有一个更新/更奇特的东西可以使用:。现在有一个更新/更奇特的东西可以使用:。请不要,在$.get上使用Ember.RSVP.resolve
,而不是创建一个明确的新承诺。这对我不起作用。store.pushPayload不返回值,因此该快捷方式不起作用。而且,它仍然会在测试中出错。我确实做到了(请参见编辑),但根据@Benjamin Gruenbaum的评论,我不确定它是否正确。请不要,在$.get`上使用Ember.RSVP.resolve
,而不是创建一个明确的新承诺。这对我不起作用。store.pushPayload不返回值,因此该快捷方式不起作用。而且,它仍然会在测试中出错。我确实做到了(请参见编辑),但根据@Benjamin Gruenbaum的评论,我不确定它是否正确。请不要,在$.get`上使用Ember.RSVP.resolve
,而不是创建一个明确的新承诺。这对我不起作用。store.pushPayload不返回值,因此该快捷方式不起作用。而且,它仍然会在测试中出错。我确实做到了(请参见编辑),但根据@Benjamin Gruenbaum的评论,我不确定它是否正确。看起来ember ajax建议现在不要使用ic ajax。是的,在文章顶部添加了一个编辑,并链接到ember ajax report。看起来ember ajax建议现在不要使用ic ajax。是的,在文章顶部添加了一个编辑,并链接到ember ajax repo。看起来ember ajax建议现在不要使用ic ajax。是的,在文章顶部添加了一个编辑,并链接到ember ajax repo