2016-05-27 17 views
5

我是Ember.js的新手,在嘗試創建數千條記錄(5300時遇到性能問題)更新hasMany關係。在創建新記錄之前,我正在向我的API請求檢索記錄。在承諾返回後,我然後對每個記錄(5300)做一個forEach來對新記錄集進行計算。創建記錄本身大約需要2秒鐘。更新hasMany只會在前40條記錄中快速啓動,然後每秒更新一次。Ember.js/Ember Data創建數千個子記錄後需要花費幾分鐘的時間來更新hasMany父項

我還應該注意到這是在組件內完成的。我知道這通常是anit模式,但在這種情況下,沒有理由更改URL或轉換。這是一個屏幕,用戶可以從物品池中選擇(由路線提供),應用定價規則,然後根據這些物品創建一個事件(在路線中創建)。確定哪些項目將成爲活動的一部分是一個沙箱。一旦用戶決定了他們的事件,然後我發送一個行動到路線來執行實際保存並堅持到我的後端。除了反模式方面,我看不到這會如何影響hasMany更新的性能。

我正在使用RESTAdapter和RESTSerializer它的價值,但這應該不會有任何影響,因爲我只是處理Ember數據存儲。

灰燼版本:

Ember    : 2.5.1 
Ember Data  : 2.5.3 
jQuery   : 2.2.3 
Ember Simple Auth : 1.1.0 

這兩種型號的問題如下...

子模型(事件項):

export default DS.Model.extend({ 
    event: DS.belongsTo('event'), 
    itemNumber: DS.attr('string'), 
    styleNumber: DS.attr('string'), 
    tier: DS.attr('string'), 
    eventPrice: DS.attr('number') 
}); 

父模型(事件):

export default DS.Model.extend({ 
    eventTypeId: DS.attr('string'), 
    eventName: DS.attr('string'), 
    eventDesc: DS.attr('string'), 
    startDate: DS.attr('moment-date'), 
    endDate: DS.attr('moment-date'), 
    priority: DS.attr('number'), 
    statusCode: DS.attr('string'), 
    value: DS.attr('number'), 
    eventItems: DS.hasMany('event-item', {async:true}) 
}); 

事件創造紀錄:在組件負責創建記錄和更新的hasMany

model() { 
    return this.store.createRecord('event', {}); 
}, 

代碼塊:

this.get('store').query('pricing', {brandCd: '00'}).then(tiers => { 
    tiers.forEach(tier => { 
     this.get('event').get('eventItems').createRecord({ 
      styleNumber: tier.get('styleNumber'), 
      itemNumber: tier.get('itemNumber'), 
      brandCd: '00', 
      tier: tier.get('tier'), 
      eventPrice: this._calculateEventPrice(tier.get('origPrice'), this.get('event').get('eventTypeId'), this.get('event').get('value')), 
     }); 
    }); 

    this.get('event').set('needsUpdated', 'Y'); 
}); 

到目前爲止,我已經嘗試了以下...

  • 添加逆關係到我的hasMany和belongsTo
  • 將所有創建記錄添加到Ember.A(),然後嘗試推新記錄到hasMany像這樣:this.get('event').get('eventItems').pushObjects(newEventItems);。也嘗試過使用this.get('event').get('eventItems').addObjects(newEventItems);
  • 在正在創建的記錄上設置belongsTo而不是更新父項(事件)的hasMany。
  • 我也繼續前進,並將此邏輯轉移到我的路線中,以確保在組件中不會出現奇怪的行爲。它執行相同的操作。

我會假設(如果我錯了,請糾正我)在客戶端嚴格創建記錄和更新關係應該能夠處理數千條記錄,而不會出現太多問題。我希望我只是在做一些不正確或者效率低下的事情,這對於有更多經驗的人來說是顯而易見的。任何幫助,包括替代品,非常感謝!

+0

你在測試什麼瀏覽器? – Terseus

+0

@Terseus,Chrome,Version 49.0.2623.75 m –

回答

0

我發現使用大型'hasMany'關係的工作也很慢。

我的建議:使用自定義端點與服務器建立關係,並通過websockets將更改通知客戶端。試圖單獨保存Ember中的5300條記錄會產生5300個網絡請求,而這可以通過1個出站請求和可能的一個websockets消息來完成,儘管可能建議將響應批量處理爲較小的集合。

無需在Ember中建立關係,直到提交更改。返回的websockets消息應該包含關係的外鍵Ember Data需要構造關係。

這意味着,在沒有父母的情況下,您會創建eventItems(或稱爲您的任何模型)。

最後,您可能會考慮按需創建子記錄,而不是嘗試立即爲用戶創建每個子項。當用戶決定從項目池中選擇項目時,請執行createRecord。 (希望我正確理解你的用例。)如果你採取這種方法,你可能甚至不需要像我所描述的那樣使用自定義端點。

最後一點忠告:您對「反模式」需要注意的是正確的:永遠不要做CRUD操作,或任何真正異步,在組件,尤其不是5300項。在異步操作完成之前,組件可以輕鬆拆除,使應用程序處於奇怪的狀態,最有可能導致錯誤。像你說的那樣,把你所做的任何事情都放在路線上,並堅持這種模式。組件應該只是顯示內容併發送操作的「愚蠢」模板。

相關問題