像普通函数一样调用 saga 是个好习惯吗?

It's a good practice call a saga like a normal function?

今天与我的团队一起检查代码库,我们发现我们混合使用 put 调度操作或直接使用 call 方法调用 saga。我总是用 put 发送动作,但不知道直接调用 saga 是错误的还是相同的。

对此有任何说明或文档吗?

function* anotherSaga() {
yield* put(logoutRequest({ tokenExpired: true }));
}
function* anotherSaga() {
yield* call(logoutSaga, {payload: { tokenExpired: true }});
}
export function* watchRemoteConfigSaga() {
  yield* takeEvery(logoutRequest, logoutSaga);
  yield* takeEvery(anotherSaga, anotherSaga);
}

两个选项都可以。

我喜欢的思考方式是 redux 操作本质上是事件。因此,如果我只想让应用程序的其余部分知道发生了什么事,我将发送一个操作,应用程序的其余部分可以对此做出反应,但对于原始传奇来说,这两种方式都没有关系。如果它是原始传奇的预期功能的一部分,那么它不应该是事件,而是使用调用效果的直接调用。

action/event 的示例:

function* fetchItemsSaga() {
  const data = yield fetch('/items')
  yield put(saveItems(data))
}

function* itemListenerSaga() {
  yield takeEvery(SAVE_ITEMS, function*(){
    console.log('New items are stored')
  }
}

直接调用示例:

function* fetchItemsSaga() {
  const data = yield fetch('/items')
  // in this case, the logic in saveItemsSaga is necessary functionality of fetchItemsSaga
  yield call(saveItemsSaga, data)
}

function* saveItemsSaga(data) {
  console.log('New items are stored')
  yield put(saveItems(data))
}

请注意第一种情况下合同如何变化 itemListenerSaga 取决于 fetchItemsSaga 而在第二种情况下 fetchItemsSaga 取决于 saveItemsSaga - 这可能会影响如何您在应用程序中导入内容并正确执行此操作对于正确封装应用程序的各个层可能很重要。