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

时间:2013-12-11 23:23:03

标签: javascript ember.js

我有一个EmberJS ArrayController。我想在这个控制器neurons上有一个计算属性,它是model属性的一个子集。子集是根据侧栏中的切换按钮计算的,该按钮绑定到currentDataset。另一个计算属性activePlots则取决于neurons; Neuron模型与hasMany的关系PlotactivePlots加载与neurons中每个神经元对象关联的所有绘图对象。

目前我正在尝试使用mapBy执行此操作,但我遇到了问题。每次检索Neuron对象的plots都会返回PromiseArray。我需要立即操纵所有返回的图。我理解我可以在单个调用then的承诺结果上调用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(plotSets)回调中then的控制台输出图片

Ember.RSVP.all(@get('neurons').mapBy('plots')).then (plotSets) -> 
  console.log(plotSets)

enter image description here

2 个答案:

答案 0 :(得分:9)

有一种方便的方法来组合promises:Ember.RSVP.all(ary)获取一个promises数组,并成为一个在解析输入数组中的所有promise时解析的promise。如果一个被拒绝,all()承诺将被拒绝。

这非常方便,例如,在启动多个并行网络请求时,并在完成所有这些请求后继续。

答案 1 :(得分:0)

除了史蒂夫所说的你可以看神经元。长度并使用Ember.scheduleOnce安排更新(下面猜到的咖啡因)

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)
)