【问题标题】:Ember Data has duplicate recordsEmber 数据有重复记录
【发布时间】:2015-04-09 16:31:45
【问题描述】:

在我的应用中,用户可以创建一条消息并发送它。当用户发送消息时,消息被创建为createRecord,如果成功,服务器回复201 Created。

此外,用户还可以通过 websocket 获取其他用户的消息。当它收到消息时,我用pushPayload将它推入商店。

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

问题是,当用户发送消息并保存它时,他们也会从 websocket 中取回它,即使两个对象具有相同的 id,商店最终也会出现重复的消息。

我如何告诉商店,当我推送或保存具有与现有元素相同 id 的东西时,它应该覆盖它?

【问题讨论】:

  • 确实如此,但仅当 websocket 响应延迟时。我确定问题是竞争条件。处理 runloops 似乎已经解决了这个问题,但我会在发布我的答案之前确保。
  • 正如你所提到的,我认为这里的运行循环是可疑的。我会确保你正在做Ember.run.next(function() { _this.store.pushPayload(....,所以它会在记录最初保存后执行。根据我的经验,它甚至可以是多个运行循环,在这种情况下,Ember.run.later 具有任意长的超时时间将在故障排除中确认这一点。
  • 不确定你的实现是什么样的,但你能延迟 websocket 的推送,至少在服务器对浏览器做出响应之后吗?这听起来很像您的 websocket 服务器实现正在同步运行,而不是像最可能应该的那样被推送到队列中。

标签: ember.js ember-data


【解决方案1】:

在添加模型之前,只需检查模型是否已经在商店中:

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);
}

【讨论】:

  • 只有当我告诉服务器在通知用户之前等待一秒钟时它才有效。我认为否则通知到达太快并且保存未完成。如果这是唯一的方法,我会接受答案,但我很惊讶 Ember Data 允许重复记录。必须有一种方法来推动和覆盖。我尝试了update 方法,但我遇到了同样的问题。
【解决方案2】:

我发现避免此问题的唯一方法是在新的运行循环中运行我的更新。如果以毫秒为单位的延迟足够长,则不会出现问题。

似乎几乎同时接收来自 websocket 的更新和请求会在 Ember Data 中产生竞争条件。

【讨论】:

  • 我可以确认这个错误在 Ember Data 1.13.11 中仍然存在。
  • WTF,真的吗??这是如何解决的?
  • 我从未说过这是一个解决方案。这更像是一个临时修复。
  • 关于这个over here 的讨论有一些更好的解决方法。设置毫秒超时来“修复”问题绝不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多