在redux传奇中是否可以同步调用store.dispatch?

在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

是否可以在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') 
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
    返回
  • next(action)
    的调用返回,saga中间件继续执行
  • saga中间件开始运行任何需要了解此操作的saga
  • 您的传奇故事开始运行,并产生一个
    delay()
    效果,告诉中间件它希望在继续之前等待。
    yield
    语句暂停您的传奇故事
  • 中间件发现没有其他传奇关注此操作,并返回
  • 一秒钟后,超时过期,中间件尝试恢复运行您的saga
因此,
delay()。你不能用它使事件循环阻塞一秒钟