Javascript Ember.js扩展模型保存
我有一些基于承诺的代码(Javascript Ember.js扩展模型保存,javascript,ember.js,coffeescript,ember-data,promise,Javascript,Ember.js,Coffeescript,Ember Data,Promise,我有一些基于承诺的代码(MyLib),我想在每个模型上运行save,因此我扩展了save函数: DS.Model.extend save: -> parentSave = @_super.bind this, arguments... deferred = Ember.RSVP.defer() MyLib.func().then((val) => @set 'prop', val parentSave() .
MyLib
),我想在每个模型上运行save,因此我扩展了save函数:
DS.Model.extend
save: ->
parentSave = @_super.bind this, arguments...
deferred = Ember.RSVP.defer()
MyLib.func().then((val) =>
@set 'prop', val
parentSave()
.then(deferred.resolve)
.fail(deferred.reject)
)
DS.PromiseObject.create promise: deferred.promise
请注意,MyLib.func()
返回的承诺是一个承诺,而不是Ember.RSVP承诺
这在实践中似乎是可行的,但是我的一些测试失败了,因为您已经打开了测试模式,这禁用了运行循环的自动运行。您需要将任何具有异步副作用的代码包装到一个Ember.run
即使在使用Ember.run
包装@set
和parentSave
调用之后,我的测试中仍然存在异步问题
我的问题是:如何用异步代码扩展save函数,以满足我的测试要求?两件事:
deffered.resolve
方法时,它必须在运行循环中运行该代码。所以你必须这样做:
parentSave().then(() ->
Em.run.next(() ->
deferred.resolve()
)
)
希望这是对的。如果我遗漏了什么,请告诉我\u super
。您必须内联调用它,而不是异步调用它