Skip to content

Instantly share code, notes, and snippets.

@glafarge
Created November 16, 2018 08:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glafarge/5bb59d515da551785aff39557a4ab48c to your computer and use it in GitHub Desktop.
Save glafarge/5bb59d515da551785aff39557a4ab48c to your computer and use it in GitHub Desktop.
Avoid flickering spinner
var spinner = document.querySelector('.spinner');
var content = document.querySelector('.content');
var refreshButton = document.querySelector('.refreshButton');
function networkRequest() {
return new Promise((resolve, reject) => {
const requestTime = 200; // request duration (for simulation) => 200ms
setTimeout(resolve, requestTime, { payload: { 'foo': 'bar' } });
});
}
function waitAtLeast(time, promise) {
const timeoutPromise = new Promise((resolve) => {
setTimeout(resolve, time);
});
return Promise.all([promise, timeoutPromise]).then((values) => values[0]);
};
function makeRequest() {
spinner.classList.add('visible'); // show spinner
let promise = networkRequest();
promise = waitAtLeast(800, promise); // wait 800ms, evenif request takes less time (to avoid animation flickering)
promise.then((data) => {
content.textContent = `Updated data, payload: ${data.payload.foo + new Date()}`;
spinner.classList.remove('active'); // hide spinner
});
}
refreshButton.addEventListener('click', () => {
makeRequest();
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment