在redux传奇中是否可以同步调用store.dispatch?
是否可以在redux saga中同步调用store.dispatch,也就是说,在采取操作的saga完成运行后返回。例如,下面的代码在redux传奇中是否可以同步调用store.dispatch?,redux,redux-saga,Redux,Redux Saga,是否可以在redux saga中同步调用store.dispatch,也就是说,在采取操作的saga完成运行后返回。例如,下面的代码 const { createStore, applyMiddleware } =require('redux') const createSagaMiddleware =require('redux-saga').default const { takeEvery ,take,fork,put}=require('redux-saga/effects') con
const { createStore, applyMiddleware } =require('redux')
const createSagaMiddleware =require('redux-saga').default
const { takeEvery ,take,fork,put}=require('redux-saga/effects')
const {delay} =require('redux-saga')
const sagaMiddleware = createSagaMiddleware()
const reducer=(state=[],action)=>{return [...state,action.type];}
const store = createStore(
reducer,
applyMiddleware(sagaMiddleware)
)
function* takeSaga() {
const action=yield take('testTake')
yield delay(1000);
console.log('from takeSaga')
}
sagaMiddleware.run(takeSaga)
const main=async ()=>{
store.dispatch({type: 'testTake'})
console.log("from main");
}
main();
输出
from main
from takeSaga
也就是说,store.dispatch({type:'testTake'})
在takeSaga
执行yield delay(1000)
语句后返回。我想归档的是,store.dispatch({type:'testTake'})
仅在takeSaga
完成其最后一条语句console.log('from takeSaga')
后返回,因此预期的输出应该是
from takeSaga
from main
可能吗?我尝试了
等待store.dispatch({type:'testTake'})
,但没有成功。据我所知,不,这是不可能的
store.dispatch()
本身是100%同步的。当您调用它时,它会运行reducer,运行任何订阅回调,然后返回
中间件可以通过拦截动作并以某种方式延迟它们来改变这一点。但是,如果中间件拦截并延迟某个操作,原始的dispatch()
调用仍将返回,因为这个特定的事件循环需要运行到完成
在您的示例中,发生的情况是:
- saga中间件看到该操作,并调用
,最终到达真正的next(action)
存储区。dispatch
- 存储调用根减速机
- 商店调用所有订户函数
返回store.dispatch
- 对
的调用返回,saga中间件继续执行next(action)
- saga中间件开始运行任何需要了解此操作的saga
- 您的传奇故事开始运行,并产生一个
效果,告诉中间件它希望在继续之前等待。delay()
语句暂停您的传奇故事yield
- 中间件发现没有其他传奇关注此操作,并返回
- 一秒钟后,超时过期,中间件尝试恢复运行您的saga
delay()。你不能用它使事件循环阻塞一秒钟