我有一个EmberJS ArrayController。我想在这个控制器neurons
上有一个计算属性,它是model
属性的一个子集。子集是根据侧栏中的切换按钮计算的,该按钮绑定到currentDataset
。另一个计算属性activePlots
则取决于neurons
; Neuron
模型与hasMany
的关系Plot
,activePlots
加载与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)
答案 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)
)