Функция тайм-аута в библиотеке 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
  }
 }