如何链接异步操作redux saga(获取XHR请求)

时间:2018-02-22 09:31:50

标签: asynchronous redux redux-saga

是否有一些通常的模式可以同步链接redux-saga异步请求?例如。 1个函数加载用户ID,第二个函数使用该ID调用一些API请求。我将尝试演示(此代码不是解决方案,只是演示)

function* laodUserSaga(action) {
  try {
    const res = yield apiGet('/user')
    const onboardingData = yield res.json()
    yield  put.resolve(loadUserSuccess(camelizeKeys(onboardingData)))
  } catch (error) {
    yield put.resolve(loadUserError(error))
  }
}
function* loadProfileDataByUserID(action) {
  const state = yield select();
  try {
    const res = yield apiGet(`/user/${state.userID}user-profile`)
    const onboardingData = yield res.json()
    yield  put.resolve(loadUserSuccess(camelizeKeys(onboardingData)))
  } catch (error) {
    yield put.resolve(loadUserError(error))
  }
}
function* loadProfileWithDataSaga(aciton){
  yield put(laodUserSaga)
  yield put(loadProfileDataByUserID)
}

function* sagaConnect() {
  yield all([
    takeLatest(LOAD_USER, laodUserSaga),
    takeLatest(LOAD_USER_DATA_BY_PROFILE_ID, loadProfileDataByUserID),
    takeLatest(LOAD_USER_WITH_PROFILE, loadProfileWithDataSaga),
  ])
}

你知道,这些例子在每个图书馆的文档中都非常有用,1个真实世界的例子通常是我在几秒钟内理解的,我是唯一的吗?

1 个答案:

答案 0 :(得分:0)

您不必使用takeEvery / Latest helper启动每个传奇。

你可以像任何其他函数一样调用传奇,例如:

function* loadProfileWithDataSaga() {
  const user = yield call(loadUser)
  const profileData = yield call(loadProfileDataByUserID, user.id)
}

您只需要撰写loadUserloadProfileDataByUserID传奇,以便他们接收并返回正确的值。如果你想通过调度动作仍然能够在其他场景中调用它们,我会创建另一个只包装loadUser / Profile功能的传奇。