2015-06-12 39 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

相关问题