Redux Saga-通过调用函数调度动作

时间:2018-06-25 07:55:34

标签: redux redux-saga

redux saga中是否有一种方法可以将由call效果所调用的函数中的操作调度到全局存储中?

例如:

export function* login({ payload }) {
  try {
    // from API.post I want to be able to dispatch an action that I will handle in a different saga.
    const resp = yield call(API.post, 'api/1/login', {
      email: payload.email,
      password: payload.password,
    });
   yield put(AuthActions.loginSuccess(resp.token));
 } catch (error) {
   yield put(AuthActions.loginError(error));
 }
}

我知道我可以使用传奇的channel,但是如果我将频道传递给API.post,则必须使用take(channel),并且我想在其他文件中处理此操作,所以我不有权访问此频道。而且我也不确定我要导出通道并将其导入到其他文件中,因为我希望每个传奇都是独立的。

我该怎么办?

1 个答案:

答案 0 :(得分:-1)

一种可能性是为API调用创建包装函数。像这样:

// `apiRequest` dispatches `anotherAction` and calls given `apiCall` 
function* apiRequest(apiCall, ...args) {
  yield put(anotherAction())
  yield call(apiCall, ...arg)
}

export function* login({ payload }) {
  try {
    const resp = yield apiRequest(API.post, 'api/1/login', {
      email: payload.email,
      password: payload.password,
    })

    yield put(AuthActions.loginSuccess(resp.token))
  } catch (error) {
    yield put(AuthActions.loginError(error))
  }
}