【问题标题】:Subscribing to updates via Faye/websockets results in duplicate records通过 Faye/websockets 订阅更新导致重复记录
【发布时间】:2013-12-30 16:53:53
【问题描述】:

更新

演示: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 被分配。

这会导致重复消息,按以下顺序:

  1. [来自createRecord的消息,将通过ajax响应解决]
  2. [通过pushPayload/Faye 插入的消息]

我希望你能理解到目前为止。一个解决方案是让 Faye 在推送有效负载之前等待保存调用解决。不幸的是,我没有对正在保存的记录的引用(发生在控制器中,faye 订阅设置在ApplicationRouter)。

我也希望它以通用的方式工作:)

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    终于找到了解决方案,但仍然欢迎其他建议。

    原来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)
    

    【讨论】:

    • 谢谢。这有助于消除重复,但我仍然必须在保存的记录上调用reload(),否则它的关系不起作用。这会触发对服务器的另一个请求。
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2021-06-01
    • 2016-04-09
    • 2015-01-24
    • 2011-10-28
    相关资源
    最近更新 更多