我的Ember / Ember-Data / Rails应用程序使用WebSockets将数据下推到客户端。我正在使用Ember-Data的loadMany方法将推送的数据添加到商店。
但是,如果当前正在编辑和保存任何推送记录,则loadMany将失败,因为该记录当前处于inFlight状态。 e.g:
- >用户编辑记录和点击保存
- > Ember-Data开始提交当前交易
- > Rails控制器使用更新的JSON响应此记录,并通过WebSockets发布更新的数据
- >在事务完成之前接收WebSockets数据,并且在记录被标记为干净之前,Ember-Data尝试使用此新数据更新记录
我发现的唯一解决方案是推迟使用Ember.run.later应用更新,超时约为20ms。 (Ember.run.next没有用。)
但是,这仅处理用户刚刚保存记录的情况。如果巧合的是,用户当前正在编辑的记录是由其他人编辑的,并且在事务完成之前收到了推送更新,那么冲突仍然会发生并触发错误。
所以我的问题是,是否有某种方式:
(a)当受影响的记录处于飞行状态时,防止商店尝试加载更改;要么 (b)延迟推送更新,直到所有交易都干净?
答案 0 :(得分:1)
*crickets*
现在,我已经通过手动检查记录是否处于不可更新状态来解决这个问题,如果是,则在退出该状态时注册回调。然后在回调之后我检查推送更新是否具有比记录更新的updatedAt
值,如果是,则将两者合并。