Это может зависеть от того, что вы подразумеваете под «безопасным».Что именно вы подразумеваете под этим в этом случае?
Во-первых, вот источник самого runSaga
и где он используется промежуточным программным обеспечением саги.
Заглянув внутрь runSaga
, я вижу:
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()
с одной и той же функцией саги несколько раз, кажется, что у вас, вероятно, будет несколько копий этой саги, что может привести к тому, что ваше приложение не захочет.
Вы можете попробовать поэкспериментировать с этим.Например, что произойдет, если у вас есть приложение счетчика, и вы делаете это?
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
ответили бы.
Если такое поведение вызывает озабоченность, то вы, вероятно, хотите убедиться, что предыдущие саги отменены.
Я действительно наткнулся на рецепт отмены саг во время горячей перезагрузки некоторое время назад, и включил версию этого в суть для моего собственного использования .Вы можете обратиться к этому за идеями.