繁体   English   中英

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

[英]Execute Code only after Multiple Promises Fulfilled in EmberJS

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

目前我正在尝试使用mapBy ,但我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)

在此输入图像描述

有一种方便的方法来组合promises: Ember.RSVP.all(ary)接受一个promises数组,并成为一个promise,当输入数组中的所有promise都被解析时,它将被解析。 如果拒绝一个,则拒绝all()保证。

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

除了Steve说你可以观看nuerons.length并使用Ember.scheduleOnce来安排更新(下面猜到了coffeescript)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM