更新

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

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

现在发生以下情况,我可以看到哪里出了问题,但是我不知道如何解决它:

  • 用户提交聊天消息
  • ChatController处理提交,使用聊天消息调用createRecord,随后#save
  • 聊天消息立即显示在聊天中(由createRecord触发)。请注意,尚未分配id
  • REST请求发送到服务器
  • 服务器首先将消息发布到Faye
  • 服务器响应REST请求
  • 在解决ajax调用之前,一条消息已经到达/messages/created
  • 消息再次插入到 View 中(当然应该与原始消息合并,但是仍然没有分配ID)
  • 解决了ajax调用,并分配了原始消息的ID。

  • 这将导致重复的消息,其顺序如下:
  • [通过createRecord发出的消息,将通过ajax响应解决]
  • [通过pushPayload/Faye插入的消息]

  • 希望到目前为止您能理解。一种解决方案是让Faye在推送有效负载之前等待save调用解决。不幸的是,我没有所保存记录的引用(发生在 Controller 中,在ApplicationRouter中设置了faye订阅)。

    我也想以一种通用的方式来工作:)

    最佳答案

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

    事实证明,保存记录后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)
    

    关于ember.js - 通过Faye/websockets订阅更新会导致记录重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20843893/

    10-10 20:09