Проблема состоит из двух частей.
Первая часть является отладочной и используется по умолчанию для прослушивателей событий, которые могут запускаться часто, особенно если их вызовы дороги или могут вызвать нежелательные эффекты.HTTP-запросы попадают в эту категорию.
Вторая часть заключается в том, что если задержка отладки меньше продолжительности HTTP-запроса (это верно для каждого виртуального случая), все равно будут конкурировать запросы, ответы приведут к изменениям состоянияс течением времени, и не обязательно в правильном порядке.
Первая часть адресована функцией debounce для уменьшения количества конкурирующих запросов, вторая часть использует Axios API аннулирования для отмены незавершенных запросов, когдаесть новый, например:
onChange = e => {
this.fetchData(e.target.value);
};
fetchData = debounce(query => {
if (this._fetchDataCancellation) {
this._fetchDataCancellation.cancel();
}
this._fetchDataCancellation = CancelToken.source();
axios.get(url, {
cancelToken: this._fetchDataCancellation.token
})
.then(({ data }) => {
this.setState({ data });
})
.catch(err => {
// request was cancelled, not a real error
if (axios.isCancel(err))
return;
console.error(err);
});
}, 200);
Вот демо 1013 *.