javascript - 在前一个完成后执行 javascript 函数

标签 javascript asynchronous settimeout

我有一个带有 setTimeout 的函数“showElement”。我怎样才能使对“btnSend”的 eventListener 中函数的调用一个接一个地执行?

我尝试使用 .then() 但没有成功。

document.getElementById('btnSend').addEventListener('click', e => {
    e.preventDefault();
    result = validateInputs(email, subject, message);
    if(result) {
        showElement(document.getElementById('formGroupSpinner'), 2000);
        showElement(document.getElementById('formGroupSuccessImg'), 2000);
        resetForm();
    }
});

//expects an html element and a number representing miliseconds. Shows the html element for that amount of time.
function showElement(element, mSeconds) {
    element.classList.remove('d-none');
    element.classList.add('d-block');
    setTimeout( () => {
        element.classList.remove('d-block');
        element.classList.add('d-none');
    }, mSeconds);
}

两个函数同时执行。

最佳答案

有许多不同的方法,但我建议使用这样的 Promise:

document.getElementById('btnSend').addEventListener('click', e => {
    e.preventDefault();
    var result = validateInputs(email, subject, message);
    if(result){
        showElement(document.getElementById('formGroupSpinner'), 2000).then(()=>{
            return showElement(document.getElementById('formGroupSuccessImg'), 2000);
        }).then(()=>{
            resetForm();
        });
    }
});

//expects an html element and a number representing miliseconds. Shows the html element for that amount of time.
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);
    });
}

基本上,.then() 之后的函数只会在您调用 resolve(); 后执行。

或者你也可以使用 callbackasync / await .

关于javascript - 在前一个完成后执行 javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671633/

相关文章:

javascript - 循环设置超时

javascript - 在滚动时触发 SVG 动画

javascript - 如何在合并排序期间将 "pause"可视化 JS p5js

c# - 循环计数 != list.Count - 在新线程中填充 List<string>

java - OrderedStreamElementQueue - 潜在的死锁

node.js - Nodejs setTimeout 循环在迭代数周后停止

javascript - 选择 JSON 返回的 html 标记内的 data-id 值

javascript - 如何使用 JavaScript 显示 blob

ios - 异步加载 UIView

javascript - 如何停止一个自调用的 setTimeout() 函数?