Redux-Saga无法在Promise中使用生成器功能吗?

时间:2018-08-07 08:23:32

标签: javascript reactjs redux-saga

我是redux-saga的新手。目前,我正在研究一个简单的登录示例。 看一下这些功能:

function sendLoginRequest(data) {
  const headers = { 'Accept': 'application/json' };
  const url = LOGIN_URL;
  const serialize = new FormData(data.event.target);
  const loginData = {
    username: serialize.get('email'),
    password: serialize.get('password'),
    client_secret: APP_SECRET_KEY,
    client_id: APP_SECRET_ID,
    grant_type: PASSWORD_GRANT_TYPE,
    scope: '*',
  }

  return axios({
    method: 'POST',
    url: url,
    data: loginData,
    headers: headers,
  });
}

export function* loginRequest(data) {
  yield takeLatest(LOGIN_REQUEST, data => {
    const response = sendLoginRequest(data);
    console.log(response);
    response
      .then(function* (data) {
        console.log(data);
        yield put(LOGIN_SUCCESS, data.data);
      })
      .catch(function* (err) {
        console.log(err);
        yield put(LOGIN_FAILURE, err.response);
      });
  });
}

如果我像这样运行中间件,那将是完美的工作

const sagaMiddleware = createSagaMiddleware();
const store = createStore(
  rootReducer,
  applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(loginRequest);

但是随后我添加了一个新的rootSaga:

export default function* rootSaga() {
    yield all([
        fork(loginRequest),
        fork(loginSuccess),
    fork(loginFailure)
    ]);
}

然后我运行rootSaga而不是loginRequest saga:

const sagaMiddleware = createSagaMiddleware();
const store = createStore(
  rootReducer,
  applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(rootSaga);

现在这些新代码根本不起作用。 当我尝试在loginRequest生成器函数中使用console.log(response);时,表明承诺已解决。而且它不会运行then-catch。

有人可以帮我解决这个问题吗? 谢谢〜

1 个答案:

答案 0 :(得分:2)

请尝试以下操作:

export function* loginRequest(data) {
  yield takeLatest(LOGIN_REQUEST, data => {
    const response = yield call(sendLoginRequest, data);

    if (response.status >= 200 && response.status < 300) {
        yield put(LOGIN_SUCCESS, data.data);
        return;
    }
    yield put(LOGIN_FAILURE, err.response);
  });
}

需要注意的是sendLoginRequest返回了一个承诺。 redux-saga旨在与使用.then()的诺言没有一起使用。您可以yield call()的任何返回诺言的函数,redux-saga将在执行下一行代码之前等待诺言得到解决。