通过Faye / websockets订阅更新会导致重复记录

时间:2013-12-30 16:53:54

标签: ember.js ember-data

更新

演示:http://jsbin.com/ogorab/311/edit


我正在尝试构建一个使用Faye / Websockets实时更新的简单聊天室。消息是使用常规REST发布的,但也有通过Faye订阅 / messages / created ,它使用store.pushPayload来推送新消息。

现在出现以下情况,我可以看到它出错的地方,但我不知道如何解决它:

  1. 用户提交聊天消息
  2. ChatController处理提交,使用聊天消息调用createRecord,然后 #save
  3. 聊天消息会立即显示在聊天中(由createRecord触发)。请注意,尚未分配id
  4. 将REST请求发送到服务器
  5. 服务器首先将消息发布给Faye
  6. 服务器响应REST请求
  7. 在解决ajax呼叫之前,已收到消息 / messages / created
  8. 该消息再次插入视图中(当然应该与原始消息合并,但仍然没有为其分配ID)
  9. 解析了ajax调用,并分配了原始邮件的ID。
  10. 这会导致重复的消息,按以下顺序:

    1. [来自createRecord的消息,将通过ajax响应解决]
    2. [通过pushPayload / Faye插入的消息]
    3. 我希望你能理解到目前为止。解决方案是让Faye在推送有效负载之前等待保存调用解析。不幸的是,我没有对正在保存的记录的引用(发生在控制器中,faye订阅在ApplicationRouter中设置)。

      此外,我希望以通用的方式工作:)

1 个答案:

答案 0 :(得分:3)

最后找到了解决方案,但仍欢迎其他建议。

结果是Store#didSaveRecord在保存记录后更新了id。通过重写此方法(然后按此顺序调用super),我们可以先检查该id的记录是否已存在:

App.Store = DS.Store.extend
  didSaveRecord: (record, data) ->
    # This will remove any existing records with the same id
    @getById(record.constructor, data.id)?.unloadRecord()
    @_super(record, data)