Я работаю над приложением поиска работы.Моя цель - информировать пользователя, когда по его поисковому запросу нет вакансий.Я знаю, что сервер отправляет статус 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}}
/>
);
}
}
В настоящее время происходит следующее:
Впервые мои RenderJobsвызывается функция из JobsComponent.js, флаг props.noJobs true и props.errMess null .
Второй раз мойВызывается функция RenderJobs, флаг props.noJobs имеет значение false и props.errMess - "undefined не является объектом (оценивающим 'response.json')"
Я не понимаю, почему происходит шаг № 2.Я ожидаю, что звонок закончится на шаге № 1.
Я был бы очень признателен, если бы кто-то мог помочь решить эту загадку.:)