Javascript 仅在多个承诺在EmberJS中实现后执行代码

Javascript 仅在多个承诺在EmberJS中实现后执行代码,javascript,ember.js,Javascript,Ember.js,我有一个EmberJS ArrayController。我想在这个控制器上有一个计算属性,神经元,它是模型属性的子集。子集是基于侧栏中的切换按钮计算的,该按钮绑定到currentDataset。另一个计算属性,activePlots则取决于神经元;Neuron模型与Plot有很多关系,activePlots加载与neurons中每个神经元对象相关的所有Plot对象 目前我正试图用mapBy来实现这一点,但遇到了一个问题。每次检索神经元对象的绘图都返回一个PromiseArray。我需要一次处理所

我有一个EmberJS ArrayController。我想在这个控制器上有一个计算属性,
神经元
,它是
模型
属性的子集。子集是基于侧栏中的切换按钮计算的,该按钮绑定到
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)
)