Функция тайм-аута в библиотеке axios не работает
Я установил axios.defaults.timeout = 1000;
Я остановил сервер, который предоставляет мне API.
Но после отправки запроса время ожидания превышает 1 с.
Вот как выглядит мой запрос:
import axios from 'axios';
axios.defaults.timeout = 1000;
return axios.post('${ROOT_URL}/login/${role}', creds).then((response) => {
console.log(response);
if(response.status === 200) {
// If login was successful, set the token in local storage
localStorage.setItem('${role}_log_toks', JSON.stringify(response.data));
// Dispatch the success action
dispatch(receiveLogin(response.data));
return response;
}
}).catch(err => {
console.log(err);
// If there was a problem, we want to
// dispatch the error condition
if(err.data && err.status === 404) {
dispatch(loginError(err.data));
} else {
dispatch(loginError('Please check your network connection and try again.'));
}
return err;
});
Я также попробовал:
return axios.post('${ROOT_URL}/login/${role}', creds, {timeout: 1000}).then...
Axios не прекращает выборку и через 5-10 минут наконец-то показывает ошибку сети. Я понимаю, что существуют другие методы обработки тайм-аута, но почему не работает функция тайм-аута в axios? Что может быть причиной того, что Axios не перестает получать?
Axios версия 0.9.1
РЕДАКТИРОВАТЬ: Как уже упоминалось в комментариях, я также попытался:
import axios from 'axios';
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
return httpClient.post('${ROOT_URL}/login/${role}', creds)
.then(handleResponse)
Ответы
Ответ 1
Вам необходимо создать экземпляр http-клиента axios:
const httpClient = axios.create();
httpClient.defaults.timeout = 500;
Затем вы можете использовать httpClient следующим образом:
return httpClient.post('${ROOT_URL}/login/${role}', creds)
.then(handleResponse)
Кроме того, вы можете установить базовый URL в той же конфигурации вместо использования ${ROOT_URL}
:
httpClient.defaults.baseURL = ROOT_URL
Ответ 2
Из этой проблемы axios (спасибо zhuyifan2013 за предоставленное решение) я обнаружил, что время timeout
axios - это время timeout
ответа, а не время ожидания соединения.
Допустим, вы запросили URL через axios, а на ответ сервера уходит много времени, в этом случае время ожидания axios будет работать.
Но у вас нет подключения к Интернету или IP-адрес или доменное имя, которое вы запрашиваете не там, в этом случае время ожидания Axios не будет работать.
Вы должны использовать следующий код
let source = CancelToken.source();
setTimeout(() => {
source.cancel();
// Timeout Logic
}, 10000);
axios.get(ip + '/config', {cancelToken: source.token}).then((result) => {
// Handle your response
});
Обратите внимание, что если у вас есть действующее соединение, все равно будет выполнен блок Timeout Logic.
Ответ 3
Этот код работает для меня:
axios({
method: "post",
url: 'http://example.com/api',
timeout: 1000 * 5, // Wait for 5 seconds
headers: {
"Content-Type": "application/json"
},
data: {
id: 1234
}
})
.then(response => {
const serverResponse = response.data;
// do sth ...
})
.catch(error => {
console.log(error);
});
Если сервер не ответит в течение 5 секунд, он переходит в блок catch.
Это также полезно: # 1503
Ответ 4
submitHashtag = async () => {
const data = await axios.post('/pwa/basics.php', {
withCredentials: true,// if user login
timeout: 30000
})
if (!data) {
// action here
alert('reload window')
return
}
}