Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ember.js扩展模型保存_Javascript_Ember.js_Coffeescript_Ember Data_Promise - Fatal编程技术网

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函数,以满足我的测试要求?

两件事:

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

    parentSave().then(() ->
        Em.run.next(() ->
            deferred.resolve()
        )
    )
    
    希望这是对的。如果我遗漏了什么,请告诉我

  • 截至,您不能以这种方式调用
    \u super
    。您必须内联调用它,而不是异步调用它