Ember.js扩展模型保存

时间:2014-04-23 17:39:34

标签: javascript ember.js coffeescript ember-data promise

我有一些基于承诺的代码(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打包parentSaveEmber.run来电,我的测试中仍然存在异步问题。

我的问题是:如何以同样满足我的测试的方式使用异步代码扩展保存功能?

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 您看到的即时错误是因为所有异步代码都必须在Ember的运行循环中运行。这意味着当你的promise解析并运行deffered.resolve方法时,它必须在run循环中运行该代码。所以你必须做这样的事情:

    parentSave().then(() ->
        Em.run.next(() ->
            deferred.resolve()
        )
    )
    

    希望这是对的。如果我错过了什么,请告诉我。

  2. Ember 1.5.0起,您无法以此方式致电_super。您必须内联而不是异步调用它。