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

Sea*_*sey 3 javascript ember.js

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

目前我正试图这样做mapBy,但我遇到了一个问题.每次检索一个Neuron对象都会plots返回一个PromiseArray.我需要立即操纵所有返回的图.我知道我可以调用then单个调用的promise结果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')
Run Code Online (Sandbox Code Playgroud)

更新:从回调console.log(plotSets)内部到控制台输出的图片then

Ember.RSVP.all(@get('neurons').mapBy('plots')).then (plotSets) -> 
  console.log(plotSets)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Ste*_* H. 9

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

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