【问题标题】:Ember.js Extend Model SaveEmber.js 扩展模型保存
【发布时间】:2014-06-08 17:04:38
【问题描述】:

我有一些基于 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 而失败。

即使我用Ember.run 包装了@setparentSave 调用,我的测试中仍然存在异步问题。

我的问题是:如何使用异步代码扩展保存功能,同时满足我的测试要求?

【问题讨论】:

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


    【解决方案1】:

    两件事:

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

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

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

    2. Ember 1.5.0 开始,您不能以这种方式调用_super。您必须内联调用它,而不是异步调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 2012-09-06
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多