AJax请求中的async:false/true的作用 (同步/异步)

背景:

最近在项目中遇到一个问题,

前台JS 部分代码

function judge() {
        var flag = 0;
        var data1 = { date1: $("#SRWS_date").val(), date2: $("#SRWS_PlanDate").val() };
        $.ajax({
            url: "/Section/sjdx",
            data: data1,
            type: "POST",
            //async:false,
            success: function (data) {
                if (data == 1) {
                    flag = 1;
                }
                else {
                    alert("计划完成招标日期不能小于申报日期!");
                    flag = 0;
                }

            }
        });

        if (flag == 1) {
            if ($("#SRWS_Rwdw").val() == "") {
                alert("单位信息不可为空");
                return false;
            }
            else if ($("#SRWS_Gznr").val() == "") {
                alert("工作内容不可为空");
                return false;
            }
            else {
                return true;
            }
        }
        else {
            return false;
        }


    }

后台sjdx代码

   public ActionResult sjdx(string date1,string date2)
        {
            var newdate1 = Convert.ToDateTime(date1);
            var newdate2 = Convert.ToDateTime(date2);

            if (DateTime.Compare(newdate1, newdate2) <= 0)
            {
                return Json(1);
            }
            else
	        {
                return Json(0);
            }
        }

由于异步,在执行ajax的同时,后面的代码也在执行的,这里flag没有被赋值到,直接flag=0,return false出去,之后才赋值上flag = 1.

昨天纠结了一会,知道是AJax异步执行导致的问题,但不知道怎么修改,经过网上查询了解到了async:

async. 默认是true,即为异步方式, $.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的success方法,这时候执行的是两个线程。

若要将其设置为false,则所有的请求均为同步请求,在没有返回值之前,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

设置为false,简单的讲就是将异步执行的代码规定为顺序执行

出现问题的这里通知设置async:false,解决了问题。

 

同步与异步的理解

同步:

同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。

异步:

将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。

同步,是所有的操作都做完,才返回给用户结果。即写完数据库之后,在相应用户,用户体验不好。

异步,不用等所有操作等做完,就相应用户请求。即先相应用户请求,然后慢慢去写数据库,用户体验较好。

异步操作例子:

为了避免短时间大量的数据库操作,就使用缓存机制,也就是消息队列。先将数据放入消息队列,然后再慢慢写入数据库。

引入消息队列机制,虽然可以保证用户请求的快速响应,但是并没有使得我数据迁移的时间变短(即80万条数据写入mysql需要1个小时,用了redis之后,还是需要1个小时,只是保证用户的请求的快速响应。用户输入完http url请求之后,就可以把浏览器关闭了,干别的去了。如果不用redis,浏览器不能关闭)。

同步就没有任何价值了吗?

银行的转账功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清晨的风Tank

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

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

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

打赏作者

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

抵扣说明:

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

余额充值