I have a user login function that is working. But, I want to incorporate a time out error for the fetch. Is there a way to set up a timer for 5 seconds or so that would stop trying to fetch after such a time? Otherwise, I just get a red screen after a while saying network error.
_userLogin() {
var value = this.refs.form.getValue();
if (value) {
// if validation fails, value will be null
if (!this.validateEmail(value.email)) {
// eslint-disable-next-line no-undef
Alert.alert('Enter a valid email');
} else {
fetch('http://51.64.34.134:5000/api/login', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
timeout: 5000,
body: JSON.stringify({
username: value.email,
password: value.password,
}),
})
.then((response) => response.json())
.then((responseData) => {
if (responseData.status == 'success') {
this._onValueChange(STORAGE_KEY, responseData.data.token);
Alert.alert('Login Success!');
this.props.navigator.push({name: 'StartScreen'});
} else if (responseData.status == 'error') {
Alert.alert('Login Error', responseData.message);
}
})
.done();
}
}
}
Timeout a fetch() request First, const { timeout = 8000 } = options extracts the timeout param in milliseconds from the options object (defaults to 8 seconds). const controller = new AbortController() creates an instance of the abort controller. This controller lets you stop fetch() requests at will.
To set request timeout with Fetch API, we can use the AbortController constructor. const controller = new AbortController(); const timeoutId = setTimeout(() => controller. abort(), 5000); const req = async () => { const response = await fetch(url, { signal: controller.
In Node. js, no default timeout is set for fetch() requests, but the newly added AbortSignal.
// Wrapper function for fetch
const fetchSomething = async () => {
let controller = new AbortController()
setTimeout(() => controller.abort(), 3000); // abort after 3 seconds
const resp = await fetch('some url', {signal: controller.signal});
const json = await resp.json();
if (!resp.ok) {
throw new Error(`HTTP error! status: ${resp.status}`);
}
return json;
}
// usage
try {
let jsonResp = await fetchSomthing();
console.log(jsonResp);
} catch (error) {
if (error.name === 'AbortError') {
console.log('Network Error');
} else {
console.log(error.message);
}
}
I think using AbortController
is the recommended way to abort a fetch
call. The code snippet above handles the following scenarios:
setTimeout
would trigger the AbortController
to abort fetch
after three seconds. The message "Network Error" will be logged.The documentation for using AbortController
to abort fetch
is here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With