在我的应用中,用户可以创建消息并发送。当用户发送消息时,将使用createRecord
创建消息,如果成功,服务器将回复201 Created。
此外,用户可以通过websocket从其他用户获取消息。当收到消息时,我会使用pushPayload
将其推送到商店。
var parsedData = JSON.parse(data);
this.store.pushPayload('message', parsedData);
问题是,当用户发送消息并保存消息时,他们也会从websocket中获取消息,即使两个对象具有相同的ID,商店也会以重复的消息结束。
我如何告诉商店,而不是推送或保存具有相同ID的现有元素的东西,它应该覆盖它?
答案 0 :(得分:3)
在添加模型之前,只需执行检查以查看模型是否已在商店中:
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);
}
答案 1 :(得分:3)
我发现避免此问题的唯一方法是在新的runloop中运行我的更新。如果以ms为单位的延迟时间足够长,则不会出现问题。
似乎几乎同时从websocket和请求接收更新会在Ember Data中创建竞争条件。