用sagas/redux撤销/重做(第2部分)

用sagas/redux撤销/重做(第2部分),redux,undo,immutable.js,redux-saga,Redux,Undo,Immutable.js,Redux Saga,使用Redux和Immutable,刚刚将Sagas合并到API层,但现在正试图通过服务器持久性解决撤消/重做问题 约束条件: 假设最大撤消/重做堆栈为2 州树很大。拥有活在过去/现在的状态树副本是不可取的 假设:在树中添加1项后,我假设当前树中的100项现在将变成101项,过去变成100项。我知道immutableJS确实有结构共享,但不确定这是否属实 我迄今为止的做法: 三种数据结构:待定、当前、未来 使用Saga中间件,将“事务启动”附加到已调度的操作 将数据缩减器包装在可撤消库(或类似库

使用Redux和Immutable,刚刚将Sagas合并到API层,但现在正试图通过服务器持久性解决撤消/重做问题

约束条件:

  • 假设最大撤消/重做堆栈为2
  • 州树很大。拥有活在过去/现在的状态树副本是不可取的 假设:在树中添加1项后,我假设当前树中的100项现在将变成101项,过去变成100项。我知道immutableJS确实有结构共享,但不确定这是否属实

    我迄今为止的做法

    三种数据结构:待定、当前、未来

  • 使用Saga中间件,将“事务启动”附加到已调度的操作

  • 将数据缩减器包装在可撤消库(或类似库)中,使用“TRANSACTION_START”筛选所有操作,保留在挂起堆栈中。与此同时,萨加给邮报打了电话

  • POST完成时触发事务\u成功,Sagas将在抛出事务\u失败之前重试3次

  • 事务失败时,从挂起堆栈(在reducer中)中删除并抛出错误。由于堆栈很小,所以我不介意遍历以将其抛出

  • 合并乐观状态树的挂起和当前状态

  • 一旦堆栈中的挂起大小>2(来自更多添加)&&bottom项标记为COMPLETE,将bottom(认为是出列)移动到CURRENT

  • 在分派撤消时,从挂起堆栈中弹出并在将来存储,取消POST,重新呈现状态

  • 参考资料: 传奇食谱

    此库用于不可变结构+撤消/重做

    (自上次更新后7个月,因此将其用作指南)

    我见过用RxJS实现commandSaga,但考虑到我们目前的团队,这是不可行的

    问题:

  • 我走对了吗
  • 这使用一个命令类,但它不处理服务器端更新。使用传奇是不必要的吗

  • 是否正常检查?

    除非两个状态之间的数据差异很大,否则没有理由担心存储许多状态树。他们共享任何未更改的内容,因此占用接近0的内存。这是有道理的。如何处理乐观更新?如果用户在使用服务器解析之前触发“撤消”会怎么样?我想我会在撤销和事务_之间展开一场传奇式的竞赛。如果两个状态之间的数据差异很大,就没有理由担心存储许多状态树。他们共享任何未更改的内容,因此占用接近0的内存。这是有道理的。如何处理乐观更新?如果用户在使用服务器解析之前触发“撤消”会怎么样?我想我已经解决了撤销和事务处理之间的竞争