【发布时间】: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