这是我尚未找到标准解决方案的一件事。
我使用redux-saga进行了商店设置以进行副作用处理,我从组件调度了一个 Action (具有异步副作用),现在希望该组件在处理了副作用后可以执行某些操作(例如,导航到另一条路线)/屏幕,弹出模态/ toast 或其他任何内容)。
我也想显示一个加载指示器或任何失败的错误。
在进行redux之前,这种流程很简单,看起来像这样:
try {
this.setState({loading: true});
const result = await doSomeRequest();
this.setState({item: result, loading: false});
} catch (e) {
this.setState({loading: false, error: e});
}
使用redux,我通常希望调度一个 Action 来启动流程并在商店中存储所有相关信息,以允许许多组件监听正在发生的事情。
我可以执行3个操作:“请求”,“成功”,“失败”。
在我的组件中,我将分派(dispatch)请求的操作。
然后,负责任的传奇将在处理“请求”时调度“成功”或“失败” Action 。
我的组件将反射(reflect)所做的更改。
但是我还没有找到一种标准的方法来判断 Action 是否完成。可能由于异步操作(NO-OP,但存储状态仍会更改),商店尚未更新。但是该操作仍然成功,并且我想执行类似导航到另一个屏幕的操作。
我确实尝试在redux文档,redux-saga文档或Stackoverflow/Google中找到这种(看似常见的)场景,但是没有成功。
注意:同样,对于redux-thunk来说,我认为这种行为是可以直接实现的,因为我可以在异步 Action 分派(dispatch)上使用.then,然后在catch中接收成功 Action 或错误 Action (如果我做错了,请纠正我,永远不要真的用过重击)。但是我还没有看到用redux-saga实现的相同行为。
我提出了3种具体解决方案:
这个例子我不仅仅喜欢1.,因为它简单且声明式。尽管我不知道在这样的运行时创建传奇会不会带来任何负面影响,或者也许还有另一种“正确”的方法来实现我对redux-saga所做的工作?
这类似于第二个示例,但是可以与您选择的任何副作用处理解决方案一起使用。
也许我正在监督某种事情,例如,如果 Prop 很快出现冰雹并且 Prop 进入组件,WillReceiveProps将“堆积”并且组件完全跳过了从不成功到成功的过渡,那么检测 Action 是否成功不起作用?
请随时查看我为此问题创建的示例项目,该示例项目已实现了完整的示例解决方案:https://github.com/milanju/redux-post-handling-example
我希望能得到一些用于处理所描述的 Action 流程的方法方面的信息。
谢谢阅读。
最佳答案
如果我正确理解了您的问题,则希望您的组件根据您的传奇触发的操作采取措施。这通常会在componentWillReceiveProps
中发生-新的 Prop 会调用该方法,而旧的 Prop 仍然可以通过this.props
使用。
然后,您将状态(请求/成功/失败)与旧状态进行比较,并相应地处理各种转换。
让我知道我是否误解了。
关于reactjs - Redux:请求成功或来自组件的错误(使用redux-saga),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44789191/