Adds cancel/abort functionality to Promises using an AbortController.
AbortController is available in all major browsers shipped after 2016 or later (except Safari; available after 2019).
const loadData = (): void => {
// if already loading data, cancel that request, we have a new one!
if (this.state.loading) {
this.state.loading.abort('Replacing existing loadData request');
}
// make an AbortController and make it accessible in state
const abortController = new AbortController();
this.setState({ loading: abortController });
// then just wrap the original Promise in AbortablePromise
AbortablePromise(axios.get('http://example.com'), abortController)
.then((data) => this.setState({ data }))
.catch((error) => this.setState({ error })
.finally(() => {
// only clear the loading state if this same call was the one that set it
if (this.state.loading == abortController) {
this.setState({ loading: false });
}
});
};