You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:18:02