2015-02-09 60 views
12

在我的應用程序中,用戶可以創建一條消息併發送它。當用戶發送消息時,將使用createRecord創建消息,服務器使用201創建成功。Ember Data有重複記錄

此外,用戶可以通過websocket從其他用戶獲取消息。當它收到一條消息時,我將它推入pushPayload的商店。

var parsedData = JSON.parse(data); 
this.store.pushPayload('message', parsedData); 

的問題是,當用戶發送的消息並保存它,他們也把它從後面的WebSocket,即使這兩個對象具有相同的ID,店裏有重複的消息結束了。

我怎麼能告訴商店,而不是當我推或保存與已有的元素相同的ID的東西,它應該重寫它?

+0

根據http://emberjs.com/api/data/classes/DS.Store.html#method_pushPayload它應該更新記錄 – Jakeii 2015-04-29 19:45:47

+1

它確實,但只有當websocket響應被延遲時。我相信這個問題是一個競爭條件。處理runloops似乎已經解決了這個問題,但在發佈我的答案之前我會確定。 – 2015-04-29 20:56:38

+0

正如你所說,我認爲運行循環在這裏是可疑的。我會確保你正在執行'Ember.run.next(function(){_this.store.pushPayload(....'所以它在記錄初始化後執行。根據我的經驗,它甚至可以是多個運行循環,在這種情況下,帶有任意長超時的'Ember.run.later'會在故障排除時證實這一點。 – mpowered 2015-05-04 03:40:05

回答

3

唯一的方法,我發現來避免這個問題是在新的runloop運行我的更新。如果延遲時間足夠長,則不會發生問題。

似乎在幾乎同時接收來自websocket和請求的更新會在Ember Data中創建競爭條件。

+2

我可以確認這個錯誤在Ember Data 1.13.11中仍然存在。 – bsegraves 2015-09-11 20:33:50

+0

跆拳道,真的嗎?這是一個解決方案? – 2016-01-04 09:40:23

+0

我從來沒有說過這是一個解決方案。這更像是一個臨時修復。 – 2016-01-09 08:27:19

3

簡單地進行檢查,以查看該模型是否已經在店裏添加它之前:

var parsedData = JSON.parse(data); 
if(this.store.hasRecordForId ('typeOfYourRecord', parsedData.id)){ 
    // logic you want to run when the model is already in the store 
    var existingItem = this.store.find('typeOfYourRecord', parsedData.id); 
    // perform updates using returned data here 
} else { 
    this.store.pushPayload('message', parsedData); 
} 
+2

只有當我告訴服務器在通知用戶之前等待一秒鐘,它才起作用。如果是唯一的方法,我會接受答案,但是我驚訝的Ember Data允許重複記錄,必須有一種方法來推送和重寫,我嘗試使用'更新'方法,但是我遇到了同樣的問題。 – 2015-02-09 21:34:55

相關問題