Как ждать полного возвращаемого значения при отправке с помощью redux-saga? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь получить myLocation (избыточное состояние) переменную, которая используется в следующей отправке GET_POSTS_REQUEST. Но когда я попытался поставить await, чтобы получить полностью возвращаемое значение, он показывает ошибку.

index. js

const testFunc = () => {
const { myLocation} = useSelector(state => state.user);
                dispatch({
                    type: MY_LOCATION_REQUEST,
                    data: {
                        lat: position.coords.latitude,
                        long: position.coords.longitude,
                    },
                });
                dispatch({
                    type: GET_POSTS_REQUEST,
                    data: {
                        dong: myLocation.dong,
                    },
                });
};

sagas / location. js

function getLocationAPI(locationInfo) {
    return axios.post('/location', locationInfo ,{withCredentials: true});
}

function* getLocation(action) {
    try {
        const result = yield call(getLocationAPI, action.data);
        yield put({
            type: GET_LOCATION_SUCCESS,
            data: result.data,
        });
    } catch (e) {
        yield put({
            type: GET_LOCATION_FAILURE,
            error: e,
        });
    }
}

function* watchGetLocation() {
    yield takeLatest(GET_LOCATION_REQUEST, getLocation);
}

export default function* locationSaga() {
    yield all([
        fork(watchGetLocation),
    ]);
}

Я должен использовать myLocation для следующего действия отправки в index.js. Но когда я попытался поставить async/await на свой dispatch, это не сработало. Есть ли какое-то решение для этого?

1 Ответ

0 голосов
/ 01 апреля 2020

put метод также отправляет, например, эту часть

yield put({
    type: GET_LOCATION_SUCCESS,
    data: result.data,
});

, которую вы всегда можете увидеть как

dispatch({
    type: GET_LOCATION_SUCCESS,
    data: result.data,
});

Так что вы должны "поймать" это с редуктором, например

function yourReducer(state = initialState, action) {
  switch (action.type) {
    case GET_LOCATION_SUCCESS:
      return Object.assign({}, state, {
        user: Object.assign({},
          state.user,
          {
            myLocation: action.data
          }
        ]
      })
    default:
      return state
  }
}

И это обновит ваше состояние с данными, возвращенными из вызова API

...