2013-12-11 58 views
3

我有一個EmberJS ArrayController。我想在此控制器上有一個計算屬性neurons,它是model屬性的子集。該子集是基於綁定到currentDataset的側邊欄中的切換按鈕計算的。另一個計算出的屬性activePlots則取決於neurons; Neuron模型與Plot的關係爲hasMany,並且activePlots加載neurons中與每個神經元對象關聯的所有繪圖對象。只有在EmberJS中實現了多個承諾後才執行代碼

目前我試圖用mapBy來做到這一點,但我遇到了一個問題。對象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') 

UPDATE:從console.log(plotSets)then回調內部控制檯輸出的照片,

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

enter image description here

回答

8

有用於組合承諾一個方便的方法,包括:Ember.RSVP.all(ary)需要承諾的陣列並且變成當輸入數組中的所有promise都被解析時,promise就會被解析。如果有人被拒絕,all()承諾被拒絕。

例如,當發出多個並行網絡請求並在所有請求都完成時繼續,這非常方便。

+0

感謝史蒂夫。我用'Em.RSVP.all(@get('neurons')。mapBy('plots'))。then(gotPlots)''實現了你的解決方案,其中'gotPlots'是我的處理函數。我發現了一些我不明白的東西,雖然 - 在'gotPlots'裏面,當我查看傳入的內容時(在一個名爲'plotSets'的參數中,在我看來它應該是一個Array的'Array' 'Plot'對象?),我發現內容不是我所期望的。它似乎是一個'Class'es數組?我張貼了上面我的控制檯輸出的圖片。我無法弄清楚如何訪問實際的陰謀對象。 –

+0

它應該是你以前回來的同樣的東西。順便說一句,如果你想在控制檯中看到「ember types」,你可以使用'console.log(Ember.inspect(plotSets))'。 –

+0

好的,是的,我現在已經有了工作。感謝您的幫助和關於'Ember.inspect'的提示。 –

0

除了什麼史蒂夫說你可以看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) 
)