wake-up-neo.net

Timeout-Funktion in der axios-Bibliothek funktioniert nicht

Ich habe axios.defaults.timeout = 1000; eingestellt

Ich habe den Server gestoppt, der mir die APIs zur Verfügung stellt.

Es dauert jedoch mehr als 1s, bis nach dem Senden einer Anforderung ein Timeout ausgeführt wird.

So sieht meine Anfrage aus:

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

Ich habe auch versucht:

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

Axios hört nicht auf zu holen und zeigt nach 5 - 10 Minuten endlich einen Netzwerkfehler. Ich verstehe, dass es andere Techniken gibt, um das Timeout zu bewältigen, aber warum funktioniert das Timeout in Axios nicht? Was kann der Grund dafür sein, dass Axios nicht aufhört zu holen?

Axios Version 0.9.1

EDIT: Wie in den Kommentaren erwähnt, habe ich auch versucht:

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

Sie müssen eine Instanz des axios http-Clients erstellen:

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

Sie können den httpClient dann wie folgt verwenden:

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

Nebenbei können Sie auch die Basis-URL in derselben Konfiguration festlegen, anstatt ${ROOT_URL} zu verwenden:

httpClient.defaults.baseURL = ROOT_URL
7
Clarkie

Dieser Code funktioniert für mich:

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

Wenn der Server nicht innerhalb von 5 Sekunden antwortet, wird der Sperrblock gesperrt.

Dies ist auch nützlich: # 1503

1
Ali Radmanesh

Aus dieser axios-Ausgabe (Dank an zhuyifan2013 für die Lösung) habe ich festgestellt, dass axiostimeoutAntwort-Timeout nicht Verbindungs-Timeoutist. _.

Angenommen, Sie haben die URL über axios angefordert, und der Server braucht lange, um zu antworten. In diesem Fall funktioniert das Timeout für axios.

Sie haben jedoch keine Internetverbindung oder die IP-Adresse oder den Domänennamen, die Sie nicht dort angegeben haben. In diesem Fall funktioniert das Timeout von axios nicht.

Sie müssen den folgenden Code verwenden 

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

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

Bitte beachten Sie, dass bei einer gültigen Verbindung immer noch der Timeout Logic -Block ausgeführt wird.

1
arthankamal
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
  }
 }
0
Naved Khan