AJAX校验字段重复时async函数返回Promise如何获取返回值?
问题原因
所有async修饰的函数默认返回Promise对象,必须通过await或者.then()回调才能拿到最终的返回值,你直接调用duplicado()拿到的是处于pending状态的Promise实例,自然不能直接拿来做布尔判断。另外你原有代码中console.log和if判断各调用了一次duplicado,会发送两次重复的AJAX请求,也需要优化。
解决方案1:async/await写法(更推荐)
给事件回调加上async修饰,用await获取异步函数的执行结果:
document.addEventListener("change", async function(evento) { if ((evento.target.id == "identificacion") || (evento.target.id == "usuario") || (evento.target.id == "correo")) { // 只调用一次异步函数,用await拿最终结果 const isDuplicated = await duplicado(evento.target); console.log(isDuplicated); if (isDuplicated) { alert("Error... duplicated"); evento.target.focus(); } } });
解决方案2:.then()回调写法
如果不想修改回调的async属性,也可以通过Promise原生的then方法处理返回结果:
document.addEventListener("change", function(evento) { if ((evento.target.id == "identificacion") || (evento.target.id == "usuario") || (evento.target.id == "correo")) { duplicado(evento.target).then(isDuplicated => { console.log(isDuplicated); if (isDuplicated) { alert("Error... duplicated"); evento.target.focus(); } }) } });
额外注意点
- 上述两种方案的校验逻辑都是异步执行的,如果你后续要做表单提交操作,需要确保校验完成之后再执行提交逻辑,不要同步判断校验结果。
- 可额外添加loading状态,避免用户在校验完成前重复操作输入框。
内容的提问来源于stack exchange,提问作者David De La Sierra-Llamazares
相关产品推荐
相关产品推荐

