2015-02-09 3 views
12

В моем приложении пользователь может создать сообщение и отправить его. Когда пользователь отправляет сообщение, сообщение создается с помощью createRecord, и сервер отвечает в 201, если он был успешно выполнен.Данные Ember имеют повторяющиеся записи

Кроме того, пользователь может получать сообщения от других пользователей через websocket. Когда он получает сообщение, я ввожу его в магазин с pushPayload.

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

Проблема заключается в том, когда пользователь отправляет сообщение и сохраняет его, они также получить его обратно от WebSocket, и даже если оба объекта имеют один и тот же идентификатор, магазин заканчивает с дублированием сообщений.

Как я могу сказать хранилище, чем когда я нажимаю или сохраняю что-то с тем же идентификатором уже существующего элемента, он должен переопределять его?

+0

Согласно http://emberjs.com/api/data/classes/DS.Store.html#method_pushPayload, он должен обновлять записи – Jakeii

+1

Он делает это, но только при отсрочке ответа на веб-расклад. Я уверен, что проблема - это состояние гонки. Сделка с runloops, похоже, устранила проблему, но я буду уверен, прежде чем отправлять ответ. –

+0

Как вы уже упоминали, я думаю, что здесь существует подозрительный цикл. Я бы удостоверился, что вы делаете 'Ember.run.next (function() {_this.store.pushPayload (....' поэтому он выполняется после того, как запись изначально сохраняется. По моему опыту, она может быть даже кратной и в этом случае 'Ember.run.later' с произвольным длительным таймаутом подтвердит это при поиске и устранении неисправностей. – mpowered

ответ

3

Единственный метод, который я нашел, чтобы избежать этой проблемы заключается в запуске мое обновление в новом runloop. Если задержка в ms достаточно долго, проблема не будет возникать.

Похоже, что получение обновления с веб-узла и запрос почти одновременно создают условие гонки в Ember Data.

+2

Я могу подтвердить, что эта ошибка все еще существует в Ember Data 1.13.11. – bsegraves

+0

WTF, действительно ?? Как это решение? –

+0

Я никогда не говорил, что это решение. Это скорее временное решение. –

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 позволяет дублировать записи. Должен быть способ нажатия и переопределения. update', но У меня та же проблема. –