redux 像正常函数一样调用一个 Saga 是一个很好的做法吗?

ijnw1ujt  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(144)

今天和我的团队一起检查代码库,我们遇到了一个混合的问题,即调度一个操作和put,或者直接用调用方法调用一个 Saga 。我总是派遣行动与把但不知道如果调用的 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);
}
gkn4icbw

gkn4icbw1#

两个选择都很好。
我认为redux操作本质上是事件。因此,如果我只是想让应用程序的其他部分知道发生了什么,我将调度一个操作,应用程序的其他部分可以对此做出React,但对于原始 Saga 来说,这两种方式都不重要。如果它是原始 Saga 的预期功能的一部分,那么它不应该是一个事件,而是一个使用呼叫效果的直接呼叫。
动作/事件示例:

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-这可能会影响您在应用中导入内容的方式,正确执行此操作对于正确封装应用的各个层可能很重要。

voase2hg

voase2hg2#

两者都很好,但不同。yield call(logoutSaga)调用logoutSaga函数并等待其完成。它是一个同步调用,就像一个通用函数调用,如果需要,它也可以返回结果,例如指示注销成功的布尔值。yield put(logoutRequest())将logoutRequest动作分派到Redux store,该动作是异步处理的。它可能会触发reducers和其他sagas在这个过程中,订阅了这个动作。

相关问题