Вы должны присоединиться к вашему запросу вызова с некоторой функцией тайм-аута и дождаться завершения обоих.Реализация на чистом JS может выглядеть следующим образом:
- Обернуть ваш запрос xhr в Promise
var makeRequest = function (url, method) {
// Create the XHR request
var request = new XMLHttpRequest();
// Return it as a Promise
return new Promise(function (resolve, reject) {
// Setup our listener to process compeleted requests
request.onreadystatechange = function () {
// Only run if the request is complete
if (request.readyState !== 4) return;
// Process the response
if (request.status >= 200 && request.status < 300) {
// If successful
resolve(request);
} else {
// If failed
reject({
status: request.status,
statusText: request.statusText
});
}
};
// Setup our HTTP request
request.open(method || 'GET', url, true);
// Send the request
request.send();
});
};
Создать некоторую функцию ожидания
var justWait = function(interval) {
return new Promise(resolve => {
setTimeout(resolve, interval);
})
}
Используйте их вместе
// apply animation here
Promise.all([
makeRequest('https://some/url/here', 'GET'),
justWait(1000)
]).then(res => {
// remove animation here
})
.catch(err => {
// remove animation here also in case of error
});
Это гарантирует, что ваша анимация будет длиться не менее интервала justWait
, но если запрос xhr длится дольше - он будет ждать до его завершения.
Если вы используете библиотеку rxjs
, вы можете использовать zip
вместо Promise.all
, однако общая идея остается прежней.