Nella mia app, un utente può creare un messaggio e inviarlo. Quando l'utente invia il messaggio, il messaggio viene creato con createRecord
e il server risponde con 201 Creato se ha esito positivo.Ember Data ha record duplicati
Inoltre, l'utente può ricevere messaggi da altri utenti tramite una web-socket. Quando riceve un messaggio, lo sposto nel negozio con pushPayload
.
var parsedData = JSON.parse(data);
this.store.pushPayload('message', parsedData);
Il problema è che, quando un utente invia un messaggio e lo salva, ma hanno anche indietro dal websocket, e anche se entrambi gli oggetti hanno lo stesso ID, il negozio finisce con messaggi duplicati.
Come posso dire al negozio che quando spingo o salvo qualcosa con lo stesso id di un elemento già esistente, dovrebbe sovrascriverlo?
Secondo http://emberjs.com/api/data/classes/DS.Store.html#method_pushPayload dovrebbe aggiornare i record – Jakeii
Lo fa, ma solo quando la risposta websocket è in ritardo. Sono sicuro che il problema è una condizione di gara. Trattare con runloop sembra aver risolto il problema, ma mi assicurerò prima di pubblicare la mia risposta. –
Come hai detto, penso che il ciclo di esecuzione sia sospetto qui. Mi assicurerei che tu stia facendo 'Ember.run.next (function() {_this.store.pushPayload (....' così viene eseguito dopo che il record è inizialmente persistito. Nella mia esperienza, può anche essere multiplo eseguire loop, nel qual caso 'Ember.run.later' con un timeout arbitrariamente lungo lo confermerà nella risoluzione dei problemi – mpowered