2015-02-09 16 views
12

W mojej aplikacji użytkownik może utworzyć wiadomość i wysłać ją. Gdy użytkownik wyśle ​​wiadomość, wiadomość zostanie utworzona za pomocą createRecord, a serwer odpowie 201 Utworzono, jeśli się powiedzie.Ember Data ma duplikaty rekordów

Ponadto, użytkownik może otrzymywać wiadomości od innych użytkowników za pośrednictwem websocket. Kiedy otrzyma wiadomość, wrzucam ją do sklepu pod numerem pushPayload.

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

Problem jest, gdy użytkownik wysyła wiadomość i zapisuje je, ale także dostać go z powrotem z websocket i chociaż oba obiekty mają ten sam identyfikator, sklep kończy się duplikaty wiadomości.

Jak mogę powiedzieć sklepowi, kiedy pcham lub zapisuję coś o tym samym identyfikatorze już istniejącego elementu, powinien on nadpisać?

+0

Zgodnie z http://emberjs.com/api/data/classes/DS.Store.html#method_pushPayload powinien zaktualizować rekordy – Jakeii

+1

Tak, ale tylko wtedy, gdy odpowiedź websocket jest opóźniona. Jestem pewien, że problemem jest stan wyścigu. Wydaje się, że radzenie sobie z runami rozwiązało problem, ale upewnię się przed opublikowaniem mojej odpowiedzi. –

+0

Jak wspomniałeś, myślę, że pętla uruchamiania jest tutaj podejrzana. Upewniam się, że robisz 'Ember.run.next (function() {_this.store.pushPayload (....), aby był wykonywany po początkowym zachowaniu rekordu. Z mojego doświadczenia wynika, że ​​może to być nawet wielokrotność uruchom pętle, w którym to przypadku 'Ember.run.later' z arbitralnie długim czasem oczekiwania potwierdzi to w rozwiązywaniu problemów – mpowered

Odpowiedz

3

Jedynym sposobem znalazłem w celu uniknięcia tego problemu jest uruchomienie mój aktualizacji w nowym runloop. Jeśli opóźnienie w ms na wystarczająco długo, problem nie wystąpi.

Wygląda na to, że otrzymywanie aktualizacji z websocket i żądanie niemal w tym samym czasie tworzy warunek wyścigu w Ember Data.

+2

Mogę potwierdzić, że ten błąd nadal istnieje w Ember Data 1.13.11. – bsegraves

+0

WTF, naprawdę ?? Jak to jest rozwiązaniem? –

+0

Nigdy nie powiedziałem, że to rozwiązanie. To bardziej przypomina tymczasową naprawę. –

3

Wystarczy wykonać test, aby sprawdzić, czy model jest już w sklepie przed dodaniem go:

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

Działa to tylko wtedy, gdy każę serwerowi poczekać sekundę przed powiadomieniem użytkowników. powiadomienie przychodzi zbyt szybko, a zapis nie został ukończony, zaakceptuję odpowiedź, jeśli jest to jedyny sposób, ale jestem zaskoczony, że Ember Data zezwala na duplikowanie rekordów.Musi być jakiś sposób na naciśnięcie i przesłonięcie. metoda aktualizacji, ale Mam ten sam problem. –

Powiązane problemy