Вы можете сделать это, используя Promise
.Вы должны обернуть свою функцию showElement()
в обещание и вызвать распознаватель обещаний при срабатывании setTimeout
.Тогда ваш код вызова может pipe
ваши обещания вместе с then
:
showElement(document.getElementById('formGroupSpinner'), 2000).then(() => {
showElement(document.getElementById('formGroupSuccessImg'), 2000).then(() => {
resetForm();
});
});
Однако, это быстро приводит к аду обратного вызова.
Вы можете избежать этого, используя async/await
.Вы помечаете свою функцию как async
, затем вы можете использовать await
внутри нее, чтобы дождаться разрешения обещаний, прежде чем переходить к следующему:
await showElement(document.getElementById('formGroupSpinner'), 2000);
await showElement(document.getElementById('formGroupSuccessImg'), 2000);
resetForm();
Вот рабочая демонстрация:
document.getElementById('btnSend').addEventListener('click', async e => {
e.preventDefault();
await showElement(document.getElementById('formGroupSpinner'), 2000);
await showElement(document.getElementById('formGroupSuccessImg'), 2000);
});
function showElement(element, mSeconds) {
return new Promise((resolve, reject) => {
element.classList.remove('d-none');
element.classList.add('d-block');
setTimeout(() => {
element.classList.remove('d-block');
element.classList.add('d-none');
resolve();
}, mSeconds);
});
}
.d-none {
display: none;
}
.d-block {
display: block;
}
<button id="btnSend">Send</button>
<div id="formGroupSpinner" class="d-none">Spinner</div>
<div id="formGroupSuccessImg" class="d-none">Success image</div>