这可能取决于你所说的“安全”是什么意思。在这种情况下你这么说到底是什么意思?
首先,这里是
source of
runSaga
itself
以及saga中间件在哪里使用它。
export function runSaga(options, saga, ...args) {
const iterator = saga(...args)
// skip a bunch of code
const env = {
stdChannel: channel,
dispatch: wrapSagaDispatch(dispatch),
getState,
sagaMonitor,
logError,
onError,
finalizeRunEffect,
}
const task = proc(env, iterator, context, effectId, getMetaInfo(saga), null)
if (sagaMonitor) {
sagaMonitor.effectResolved(effectId, task)
}
return task
}
我从中得到的是,当你打电话的时候,不会有什么“破坏性”的事情发生
runSaga(mySagaFunction)
. 但是,如果你打电话
runSaga()
使用同一个saga函数多次,您可能会运行该saga的多个副本,这可能会导致应用程序不想要的行为。
你可以试试这个。例如,如果您有一个计数器应用程序,并执行此操作,会发生什么?
function* doIncrement() {
yield take("DO_INCREMENT");
put({type : "INCREMENT"});
}
sagaMiddleware.runSaga(doIncrement);
sagaMiddleware.runSaga(doIncrement);
store.dispatch({type : "DO_INCREMENT"});
console.log(store.getState().counter);
// what's the value?
我猜计数器应该是2,因为两份
doIncrement
会有反应的。
如果这种行为是一个问题,那么你可能想确保之前的传奇故事被取消。
事实上,我偶然发现了一个配方取消传奇热重新加载一段时间,和
included a version of that in a gist for my own usage
. 你可能想参考一下。