New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如何cancel effects #1749
Comments
你可以在 model 的 subscriptions 监听路由变化,当页面为非A页面(离开A页面)或A页面(进入A页面)时手动清除 model A 的state 状态。 |
谢谢回答。这个方法我已经试过了,清除state状态本身没有什么问题,无论是在componentWillUnmount时清除还是在subscriptions监听路由变化时清除都可以,问题是清除了modal 的state后,effects中的异步操作返回的数据还是会重新写入modal的state中,导致上一次业务的脏数据。 |
楼主的问题,我也遇到过,想在组件卸载时取消掉未完成的effect,但是发现没有办法,dva好像没有提供这类api啊@sorrycc |
是否可以取消effects,将sagas独立出来 |
@dlamon 遇到的同样的情况,想在路由切换的时候清理。请问现在有解决方法吗? |
@KyrieChen 在路由切换时清理估计也不行,因为路由切换完成后,通讯有可能还没回来,通讯回来后仍然会把脏数据写回到清理后的model数据区。 我现在的做法是每次进入交易时(componentWillMount时),在当前交易对应的model数据区中生成一个带UUID的子数据区,用于存储当次交易使用的数据,在reducer写入数据时带UUID写入,在交易退出(componentWillUnmount)时清理(clear)。类似于下面的model结构: 但是这种方式也不算好,第一增加了逻辑复杂性,第二是获取初始值需要增加空值判断,增加了代码复杂性。由于我做的主要是针对金融系统,很怕这种脏数据,才选择这种方式。 |
@dlamon 我也碰到了,自己写了个demo,感觉有点问题 https://codesandbox.io/s/yqwqpmvwvj |
取消一个
|
@dlamon dva貌似没有提供清除某个effect的api。但是model中定义的effect中可以写多个saga。
bgSync是你的异步任务,可以action:start开始任务,action:stop取消任务。这能实现cancel某个effect。 |
@wss1942 感谢!
在离开交易时(componentWillUnmount),dispatch clear就可以取消当前model中所有未完成的effects,getProductLoading和getCityLoading也可以正常使用。
|
Code to reproduce the issue: (请提供可复现的代码或者步骤)
场景:如果项目中存在两个页面A和B,分别对应model A和model B,在每个页面中都存在一些异步的网络请求, 在effects中发起并将返回数据通过reducer写入到当前model的state中。
在离开页面A或页面B时,我希望清空对应model中的数据,以免成为下次重新使用时的脏数据。
我在model 里编写了 clear 的 reducer,在componentWillUnmount方法中
dispatch({ type:${model.namespace}/clear})
Expected behavior: (预期的正常效果)
用户从A页面进入B页面,model A中的数据被清理,恢复到初始状态。
Actual behavior: (实际效果)
用户从A页面进入B页面时,如果A页面中发生了异步网络请求,在网络请求还没有完成时进入B页面,A页面会首先通过clear的reducer清除掉model A数据,但是当effects中的网络请求完成时,会将返回数据重新写入model A,导致model A中存在上一次业务的脏数据。
请问是否能够在离开A页面时cancel指定的effects,或者cancel掉一个namespace中所有的effects。(类似redux-saga中的cancel)
Versions of packages used: (哪个库的哪个版本出现的问题)
v2.2.3
The text was updated successfully, but these errors were encountered: