Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 什么';在Ember中进行异步调用的正确方法是什么?_Ember.js_Promise_Ember Cli - Fatal编程技术网

Ember.js 什么';在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); }); 这打破了余烬的测试: 未捕获错误:断言失败:您已打开测试模式,该模式禁用了运行循环的自动运行。 您需要在运行中包装任何具有异步副作用的代码 我可以通过在我的承

对于特定的服务调用,我使用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) => {
  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