dva yield put 是异步的吗?yield call 是同步的吗?

发布于 2022-09-06 20:19:08 字数 934 浏览 12 评论 0

我遇到了一个先setItem还是先getItem的BUG。
如果这样写
图片描述

我感觉这几个yield put是异步的。有时候yield put app/query 还没执行完,直接跳转 yield put(routerRedux.push(from))了导致我的程序先get到null,后set。

后来我把跳转写到'app/query'的最后一行了,它就永远是先setItem 然后 subscription里面的getItem

 subscriptions: {
    setupWs({ dispatch, history }) {
      history.listen(({ pathname }) => {
      let userId = localStorage.getItem('stompUserId');
          });
        }
      }); 

effects: {
    * query({
    localStorage.setItem('stompUserId', id);
    if (from && from !== '/login') {
          yield put(routerRedux.push(from))
        } else if (locationPathname === '/login') {
          yield put(routerRedux.push('/dashboard'))
        }
        })
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

浅唱々樱花落 2022-09-13 20:19:08

都是同步方法。yield把异步方法转换为同步方法。而call和put则是针对post和get两种不同的触发方式

待"谢繁草 2022-09-13 20:19:08

yield put reducer里的方式是同步的
yield put effects里的方法是异步的

水溶 2022-09-13 20:19:08

什么call和put是分别post和get,先setItem 然后 subscription里面的getItem。正常subscription是对异步进行初始化,所以应该是你setItem改变了数据react重新渲染UI然后又触发subscription进行初始化操作。
在Modal模块里面yield是使用了Generator语法https://es6.ruanyifeng.com/#d...
所以你想要异步请求同步执行不要写在View层,就写在modal里面,懂我意思不。视图层async await没有用。我就知道那么多,我也刚开始学。
https://segmentfault.com/a/11...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文