记录一次错误:JavaScript 回调函数中的 return false 问题

本文探讨了在JavaScript中使用Ajax进行邮箱注册校验时遇到的问题。当Ajax请求在success回调中return false时,外部代码仍继续执行。原因是Ajax默认为异步,需设置async为false使其同步执行。解决方案是通过全局变量控制流程,当校验失败时设置变量为false,然后在Ajax外部检查该变量决定是否返回false。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中js文件中的一个功能函数:

// 注册邮箱校验
function validateEmail() {
    var id = "email";

    //获取输入文本框内容
    var value = $("#"+id).val();
    //1.非空校验
    if(!value){
        //先获取对应的label,再添加错误信息,最后显示label并返回一个false
        $("#"+id+"Error").text("Email不能为空!");
        showError($("#"+id+"Error"));
        return false;
    }
    //2.Email格式校验
    if(!/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(value)){
        //先获取对应的label,再添加错误信息,最后显示label并返回一个false
        $("#"+id +"Error").text("错误的Email格式!");
        showError($("#"+id +"Error"));
        return false;
    }

    // 3.是否注册校验(略)
	$.ajax({
	    url:"/ajaxValidateEmail.do",  //要请求的控制器方法
	    data:{email:value},  //给服务器的参数
	    type:"post",
	    dataType:"json",
	    cache:false,//不让浏览器缓存数据
	    success:function(resp) {
	        if(!resp) {  //如果校验失败
	            $("#"+id+"Error").text("Email已被注册!");
	            showError($("#"+id+"Error"));
	            return false;
	        }
	    }
	});
   
    return true;

遇到错误模块:

 $.ajax({
        url:"/ajaxValidateEmail.do",  //要请求的控制器方法
        data:{email:value},  //给服务器的参数
        type:"post",
        dataType:"json",
        cache:false,//不让浏览器缓存数据
        success:function(resp) {
            if(!resp) {  //如果校验失败
                $("#"+id+"Error").text("Email已被注册!");
                showError($("#"+id+"Error"));
                return false;
            }
        }
    });

    return false;

问题:

就是希望在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行。
不解的是在回调函数中已经 return false 了,但是 Ajax 方法外部的后续return false语句却仍然继续执行。
即校验失败的时候,希望程序终止执行。但是程序却仍然向下执行,使函数返回值为false。

原因:

首先,这里 Ajax 方法默认是异步请求(async:true),我们必须设置为同步请求(async:false),这样才会等待当ajax 执行完毕之后,才会继续执行其他代码。
因为我没有理解在 return false 时发生了什么。当调用 return false时,实际上有三个处理过程:

  1. event.preventDefault(); —— 阻止浏览器默认的行为
  2. event.stopPropagation(); —— 停止事件冒泡
  3. 停止回调函数执行并立即返回

所以,在以上代码的回调函数部分中执行了 return false,就表示停止回调函数的执行并立即返回,不再履行函数内的代码,但函数外的代码仍然会执行。
因此,程序在 Ajax 方法外的后续语句可以继续执行,不会影响。

解决方法:

所以,我们如果想要达到在校验失败的情况下,终止程序执行的效果, 可以在全局范围内声明一个变量,并且在 Ajax 方法中给该变量重新赋值, 然后在Ajax方法外的后续语句中判断该全局变量的值。

修改后代码如下:

// 注册邮箱校验
function validateEmail() {
    var id = "email";

    var flag = 1;

    //获取输入文本框内容
    var value = $("#"+id).val();
    //1.非空校验
    if(!value){
        //先获取对应的label,再添加错误信息,最后显示label并返回一个false
        $("#"+id+"Error").text("Email不能为空!");
        showError($("#"+id+"Error"));
        return false;
    }
    //2.Email格式校验
    if(!/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(value)){
        //先获取对应的label,再添加错误信息,最后显示label并返回一个false
        $("#"+id +"Error").text("错误的Email格式!");
        showError($("#"+id +"Error"));
        return false;
    }

    // 3.是否注册校验
    $.ajax({
        url:"/ajaxValidateEmail.do",  //要请求的控制器方法
        data:{email:value},  //给服务器的参数
        type:"post",
        dataType:"json",
        cache:false,//不让浏览器缓存数据
        async:false,//设为同步请求
        success:function(resp) {
            if(!resp) {  //如果校验失败
                $("#"+id+"Error").text("Email已被注册!");
                showError($("#"+id+"Error"));
                flag = 0;
            }
        }
    });

    // 判断执行Ajax请求之后,是返回true还是false
    if(!flag){
        return false;
    }

    return true;

注意:

在这里需要把 Ajax 方法的 async 设为 false,即同步请求,此时 Ajax方法的行为就像一个普通函数,浏览器会一直等待请求完成,然后才会执行脚本的后续语句。

ajax 同步和异步区别?

我们在使用 ajax 一般都会使用异步处理。

  • 异步处理:就是我们通过事件触发 ajax,请求服务器,在这个期间,无论服务器有没有响应,客户端的其他代码一样可以运行。

  • 同步处理:就是我们通过事件触发 ajax,请求服务器,在这个期间,须要等待服务器处理请求,客户端不能做任何处理。只有当 ajax 执行完毕后,才会继续执行其他代码。

  • 同步:提交请求 -> 服务器处理(处理期间,同步须要等待返回结果,才能继续执行后续的代码,这个期间客户端浏览器不能干任何事) -> 处理完毕返回

  • 异步:提交请求 -> 服务器处理(处理期间,异步不必等待返回结果,就可以执行后续的代码,这个期间客户端浏览器可以做其他事情) -> 处理完毕返回,一般需要监听异步的结果

同步是在一条直线上的队列,异步不在一个队列上 各走各的

jquery 的 async:false,这个属性默认是true:异步,false:同步。举例:

  • 同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
  • 异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到忙完才去吃饭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无霸哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值