我有一些基于承诺的代码(MyLib
),我想在每个模型保存上运行,所以我扩展了保存功能:
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()
返回的承诺是rsvp.js承诺,而不是Ember.RSVP承诺。
这似乎在实践中有效,但我的一些测试失败了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 an Ember.run
。
即使用@set
打包parentSave
和Ember.run
来电,我的测试中仍然存在异步问题。
我的问题是:如何以同样满足我的测试的方式使用异步代码扩展保存功能?
答案 0 :(得分:1)
两件事:
您看到的即时错误是因为所有异步代码都必须在Ember的运行循环中运行。这意味着当你的promise解析并运行deffered.resolve
方法时,它必须在run循环中运行该代码。所以你必须做这样的事情:
parentSave().then(() ->
Em.run.next(() ->
deferred.resolve()
)
)
希望这是对的。如果我错过了什么,请告诉我。
自Ember 1.5.0起,您无法以此方式致电_super
。您必须内联而不是异步调用它。