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

我遇到了一个先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'))
        }
        })
        }
阅读 15k
4 个回答
新手上路,请多包涵

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

新手上路,请多包涵

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

什么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...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏