Javascript 仅在多个承诺在EmberJS中实现后执行代码
我有一个EmberJS ArrayController。我想在这个控制器上有一个计算属性,Javascript 仅在多个承诺在EmberJS中实现后执行代码,javascript,ember.js,Javascript,Ember.js,我有一个EmberJS ArrayController。我想在这个控制器上有一个计算属性,神经元,它是模型属性的子集。子集是基于侧栏中的切换按钮计算的,该按钮绑定到currentDataset。另一个计算属性,activePlots则取决于神经元;Neuron模型与Plot有很多关系,activePlots加载与neurons中每个神经元对象相关的所有Plot对象 目前我正试图用mapBy来实现这一点,但遇到了一个问题。每次检索神经元对象的绘图都返回一个PromiseArray。我需要一次处理所
神经元
,它是模型
属性的子集。子集是基于侧栏中的切换按钮计算的,该按钮绑定到currentDataset
。另一个计算属性,activePlots
则取决于神经元
;Neuron
模型与Plot
有很多关系,activePlots
加载与neurons
中每个神经元对象相关的所有Plot对象
目前我正试图用mapBy
来实现这一点,但遇到了一个问题。每次检索神经元
对象的绘图
都返回一个PromiseArray
。我需要一次处理所有返回的绘图。我知道我可以调用,然后对单个调用的承诺结果调用get('plots')
,但如何仅在所有神经元的get('plots')
调用返回后执行代码
neurons: ( ->
@get('model').filterBy('dataset', @get('currentDataset'))
).property('model', 'currentDataset'),
activePlots: ( ->
plots = @get('neurons').mapBy('plots')
# ...code to execute after all plots have loaded
).property('neurons')
更新:控制台输出的图片,来自console.log(绘图集)
中的,然后
回调到
Ember.RSVP.all(@get('neurons').mapBy('plots')).then (plotSets) ->
console.log(plotSets)
有一种方便的组合承诺的方法:Ember.RSVP.all(ari)
接受一个承诺数组,并在解析输入数组中的所有承诺时成为解析的承诺。如果一个被拒绝,那么all()
承诺将被拒绝
例如,当启动多个并行网络请求并在所有请求都完成后继续时,这非常方便。除了Steve所说的,您还可以观看nuerons.length并使用Ember.scheduleOnce来安排更新(下面是猜测的coffeescript)
谢谢你,史蒂夫。我已经用Em.RSVP.all(@get('neurons').mapBy('plots'))实现了您的解决方案。然后(gotPlots)
,其中gotPlots
是我的处理函数。但是,我发现了一些我不理解的东西——在gotPlots
中,当我查看传入的内容时(在一个名为plotset
的参数中,在我看来它应该是数组的数组的对象的数组的对象的时,我发现内容不是我所期望的。它似乎是一个Class
es的数组?我在上面贴了一张我的控制台输出的图片。我不知道如何访问实际的绘图对象。它应该和你以前得到的一样。顺便说一句,如果你想在控制台中看到“余烬类型”,你可以使用console.log(余烬.inspect(plotset))
。好的,我现在有工作了。感谢您的帮助和Ember.inspect上的提示。
activePlots: [],
watchNuerons: ( ->
Ember.run.scheduleOnce('afterRender', this, @updatePlots);
).observes('nueron.length'),
updatePlots: ( ->
plots = @get('neurons').mapBy('plots')
# ...code to execute after all plots have loaded
@set('activePlots', plots)
)