javascript - 前一个完成后执行javascript函数
问题描述
我有一个具有 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();
.
或者,您也可以使用回调或async / await。
推荐阅读
- swift - 斯威夫特:编写输出流
- python - 如何为子图添加颜色条
- java - JsonObject 默认为 json 字符串添加反斜杠
- android - UnsatisfiedLinkError,使用 io.requery:sqlite-android:3.28.0 时找不到“libsqlite3x.so”
- passwords - 使用 Terraform 从 Vault 中检索键和值
- python - 使用检查模块获取继承对象的名称
- visual-studio - 在 Visual Studio 2019 中安装“使用 .NET 进行移动开发”
- azure-devops - Azure 工件是否存储通用包的增量?
- c++ - 不同长度的 std::string 的 std::move 性能问题
- c++ - 将 Microsoft SAPI 文本转语音与 SSML 结合使用