使用redux-saga进行ajax调用并更新存储

时间:2018-04-11 11:14:32

标签: reactjs redux redux-saga

我对整个React env很新,我试图使用redux-saga库为Google Api创建一个GET请求。

我有点遗失两件事。第一个问题是我的传奇函数被一次又一次地调用(不知道为什么)。

第二件事是如何将数据正确传递给reducer。

这是我的传奇:

function* watchAutoCompleteFetch() {
  yield takeLatest(UPDATE_ZIP_AUTOCOMPLETE, requestAutoComplete);
}

function requestAutoCompleteApi() {
  return fetch(
    'some-url-here'
  ).then((response) => response.json())
  .then((json) => json)
  .catch((e) => {
    put({type: "AUTOCOMPLETE_ZIP_FETCH_FAILED", message: e.message});
  });
}

function* requestAutoComplete() {
  const data = call(requestAutoCompleteApi);
  yield put(updateZipAutoCompleteAction(data));
}

和减速机功能:

const updateZipAutoComplete = (state, data) => {
  debugger;
  return state;
};

在reducer中,我将数据作为redux-saga中的某种调用对象,而不是promise,也不是数据。

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

所以,事实证明确实存在两个问题。一个是我缺少yield关键字,第二个是我总是调用相同的reducer,它再次触发了dispatch事件,它进入循环并永远运行。

实际解决方案如下所示:

function* watchAutoCompleteFetch() {
  yield takeLatest(UPDATE_ZIP_AUTOCOMPLETE, requestAutoComplete);
}

function requestAutoCompleteApi() {
  return fetch(
    'some-url-here'
  ).then((response) => response.json())
  .catch((e) => {
    console.log(e)
  });
}

function* requestAutoComplete() {
  const data = yield call(requestAutoCompleteApi);
  if(data.status ==="OK") {
    yield put(updateZipAutoCompleteSucceedAction(data));
  } else {
    yield put(updateZipAutoCompleteFailedAction(data));
  }
}