Невозможно отобразить состояние, когда нет доступных работ - PullRequest
0 голосов
/ 07 июля 2019

Я работаю над приложением поиска работы.Моя цель - информировать пользователя, когда по его поисковому запросу нет вакансий.Я знаю, что сервер отправляет статус 204, когда нет доступных рабочих мест.Моя работа состоит в том, чтобы отображать соответствующее сообщение, когда я получаю статус 204, но я не могу этого сделать.

Я пробовал несколько способов в моей функции fetchJobs () для обработки статуса 204.Однако ни один из них не работает - я все еще получаю сообщение об ошибке в функции RenderJobs из JobsComponent.js.

Мой ActionCreator.js таков:

export const fetchJobs = (address, job) => async (dispatch) => {
    dispatch(jobsLoading());
    var addressObj = JSON.parse(JSON.stringify(address));
    var obj = {"origin": [addressObj.lng, addressObj.lat], "job_details": [job]};
    const apiUrl = baseUrl + 'api/jobs/available_jobs';
    return fetch(apiUrl, {
    method: 'POST',
    body: JSON.stringify(obj),
    headers:{
    'Content-Type': 'application/json'
  }
})
    .then(response => {
    if (response.ok && response.status == 200) {
      return response;
    }
    else if (response.ok && response.status == 204) {
       dispatch(noJobsAvailable());
       return;
    }
    else {
      var error = new Error('Error is: ' + response.status + ': ' + response.statusText);
      error.response = response;
      throw error;
    }
  },
      error => {
            var errmess = new Error(error.message);
            throw errmess;
      })
    .then(response => response.json())
    .then(jobs => dispatch(addJobs(jobs)))
    .catch(error => dispatch(jobsFailed(error.message)));
};

export const noJobsAvailable = () => ({
    type: ActionTypes.NO_JOBS_AVAILABLE
});

Это мой редуктор:

import * as ActionTypes from '../ActionTypes';

const initialState = {
    jobs: [],
    isLoading: true,
    noJobs: false,
    errMess: null
  };

export const jobs = (state = initialState, action) => {
    switch (action.type) {
        case ActionTypes.GET_JOBS:
            return {...state, isLoading: false, noJobs:false, errMess: null, jobs: action.payload};

        case ActionTypes.JOBS_LOADING:
            return {...state, isLoading: true, noJobs:false, errMess: null, jobs: []}

        case ActionTypes.NO_JOBS_AVAILABLE:
            return {...state, isLoading: false, noJobs: true, errMess: null, jobs: []}

        case ActionTypes.JOBS_FAILED:
            return {...state, isLoading: false, noJobs:false, errMess: action.payload};

        default:
          return state;
      }
};

А это моя функция RenderJobs из JobsComponent.js:

function RenderJobs(props) {
    var json = JSON.parse(props.jobsData);
    //create a sorted array based on 'json', called sort_array
    const renderJobItem = ({item}) => {
        //process the API response for displaying it
        return (
        //component for displaying the API response
    }

if (props.isLoading) {
    return (
            <Loading /> //custom loading component
    );
}
else if (props.noJobs) {
    return (
        <View style={styles.errorView}>
        <Text style={styles.errorTextStyle}>No jobs available</Text>                                           
    </View>
    )
}
else if (props.errMess) {
    return(
        <View style={styles.errorView}>
            <Text style={styles.errorTextStyle}>An error occurred</Text>
        </View>
    );
}
else {
    return (
        <FlatList 
                data={sort_array}
                renderItem={renderJobItem}
                keyExtractor={(item, index) => index.toString()}
                style={{marginTop: 10}}
                />
    );
}

}

В настоящее время происходит следующее:

  1. Впервые мои RenderJobsвызывается функция из JobsComponent.js, флаг props.noJobs true и props.errMess null .

  2. Второй раз мойВызывается функция RenderJobs, флаг props.noJobs имеет значение false и props.errMess - "undefined не является объектом (оценивающим 'response.json')"

Я не понимаю, почему происходит шаг № 2.Я ожидаю, что звонок закончится на шаге № 1.

Я был бы очень признателен, если бы кто-то мог помочь решить эту загадку.:)

...