web-dev-qa-db-fra.com

La fonctionnalité de délai d'attente dans la bibliothèque axios ne fonctionne pas

J'ai mis axios.defaults.timeout = 1000;

J'ai arrêté le serveur qui me fournit les API.

Mais il faut plus de 1 minute pour expirer après l'envoi d'une requête.

Voici à quoi ressemble ma demande:

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;
      });

J'ai aussi essayé:

return axios.post(`${ROOT_URL}/login/${role}`, creds, {timeout: 1000}).then...

Axios n'arrête pas de chercher et après 5 à 10 minutes, il affiche finalement une erreur de réseau. Je comprends qu’il existe d’autres techniques pour gérer le délai d’expiration, mais pourquoi la fonctionnalité de délai d’exécution d’axios ne fonctionne-t-elle pas? Quelle pourrait être la raison pour laquelle axios n'arrête pas de chercher?

Axios version 0.9.1

EDIT: Comme mentionné dans les commentaires, j'ai aussi essayé:

import axios from 'axios';

const httpClient = axios.create();

httpClient.defaults.timeout = 500;

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)
12
rash.tay

Vous devez créer une instance du client HTTP axios:

const httpClient = axios.create();
httpClient.defaults.timeout = 500;

Vous pouvez ensuite utiliser le httpClient comme suit:

return httpClient.post(`${ROOT_URL}/login/${role}`, creds)
  .then(handleResponse)

Sur une note, vous pouvez également définir l’URL de base dans la même configuration au lieu d’utiliser ${ROOT_URL}:

httpClient.defaults.baseURL = ROOT_URL
7
Clarkie

Ce code fonctionne pour moi:

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);
});

Si le serveur ne répond pas dans les 5 secondes, il est bloqué.

Ceci est également utile: # 1503

1
Ali Radmanesh

À partir de ce question d'axios } _ (Merci à zhuyifan2013 pour avoir fourni la solution), j'ai constaté que axiostimeout est délai de réponse et non délai de connexion.

Disons que vous avez demandé l'URL via axios et que le serveur met longtemps à répondre. Dans ce cas, le délai d'attente axios fonctionnera.

Mais vous n'avez pas de connexion Internet ou l'adresse IP ou le nom de domaine que vous demandez n'existe pas, dans ce cas, le délai d'expiration de axios ne fonctionnera pas.

Vous devez utiliser le code suivant 

  let source = CancelToken.source();
  setTimeout(() => {
    source.cancel();
    // Timeout Logic
  }, 10000);

  axios.get(ip + '/config', {cancelToken: source.token}).then((result) => {
    // Handle your response
  });

Veuillez noter que si vous avez une connexion valide, le bloc Timeout Logic sera toujours exécuté.

1
arthankamal