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?
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)
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
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
Aus dieser axios-Ausgabe (Dank an zhuyifan2013 für die Lösung) habe ich festgestellt, dass axiostimeout
Antwort-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.
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
}
}