【问题标题】:Generic way to revert to old state if asynchronous action failed?如果异步操作失败,恢复到旧状态的通用方法?
【发布时间】:2017-08-05 21:22:21
【问题描述】:

我将所有状态保存在 store 中,并使用 redux-sagas 处理所有异步操作。

因此,例如,如果我有一个整数字段,其更改应触发异步操作,我将 TextInput 值连接到存储中的实际值。 一旦用户更改了值并离开该字段,我就会调度一个动作。 这将被一个调用 API 的 saga 获取。但如果失败,我需要恢复以前的值。有什么好的方法来处理它?

目前我在动作中传递旧值和新值,以便 saga 可以放置一个新动作来恢复它,但这感觉像是一个杂物。以前没有遇到过这种情况吗?

【问题讨论】:

    标签: react-native redux redux-saga


    【解决方案1】:

    好吧,如果您想恢复旧值,则必须将其存储在某个地方。但是,与其将旧值和新值都传递给您的操作,我只会记住您状态中的旧值。

    您的状态可能如下所示:

    const state = {
      value: 5,
      oldValue: 4
    };
    

    然后当值发生变化时,您会将oldValue 更新为valuevalue 为新值。如果 API 调用失败,您可以再次将 value 设置为 oldValue

    完整示例:https://codesandbox.io/s/0RORjNm8y

    【讨论】:

    • 两个问题:(1)与我将旧值放入操作相比,这不会失去可串行性吗? (2) 不相关,但是您在 mapDispatchToProps 中使用 bindActionCreators() 是否有特定原因?感谢您不厌其烦地创建一个完整的示例!
    • 1) 您不会失去可序列化性,因为您仍然只存储简单的值(没有函数、类、递归引用等)。相反,此解决方案将与时间旅行和其他工具很好地配合使用。 2) bindActionCreators 只是一个方便的实用程序,可以绑定所有的动作创建者(将它们包装在调度中)。自己也可以这样做。
    • 也许我措辞错误。我的意思是.. 用户可以编辑该字段两次,将触发两个异步操作,如果触发的第二个操作在第一个操作之前成功完成,而第一个操作失败,则会意外恢复旧值。我的方法遇到了类似的问题,只有它会恢复原始(假定正确)值,您的方法会在第一次编辑后恢复错误值。最好的选择可能是在现场运行异步时阻止编辑。
    • 那么,基本上你想要这样的行为吗? codesandbox.io/s/1y72w5p87(使用除数字以外的任何其他字符使其失败)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2016-06-21
    • 2022-11-02
    • 2017-05-07
    • 2011-01-17
    相关资源
    最近更新 更多