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'))
}
})
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
dva-knowledgemap
都是同步方法。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...