ajax同步和异步

同步和异步区别

同步

同步请求即是当前发出请求后,浏览器什么都不能做,必须得等到请求完成返回数据之后,才会执行后续的代码,相当于是排队,前一个人办理完自己的事务,下一个人才能接着办。也就是说,当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面处于一个假死状态,当这个AJAX执行完毕后才会继续运行其他代码页面解除假死状态。

简单总结为:上一件事情没有完成,继续处理上一件事情,只有上一件事情完成了,才会做下一件事情 。

代码演示
$.ajax({
    url: baseurl + "/system/projectInfo/list2",
    type: "post",
    async: false, //使用同步的方式,true为异步方式
    data: obj, //请求的参数 = 给后台传的参数
    success: function(data) {
      for (var i = 0, length = data.data.length; i < length; i++) {
        projectInfoHtml +=
          "<tr data-id="+data.data[i].id+">" +
          "<td><input type='checkbox' name='checkItem'></td>" +
          "<td style='width:55%'><a  target='_blank' href='../jgw/infor_detail.html?id="+ data.data[i].id+" ' style='width:400px;overflow:hidden;text-overflow:ellipsis'> "+
          data.data[i].title +
          "</a></td>" +
          "<td>" +
          data.data[i].region +
          "</td>" +
          "<td>" +
          data.data[i].stage +
          "</td>" +
          "<td>" +
          data.data[i].type +
          "</td>" +
          "<td>" +
          data.data[i].createDate +
          "</td>" +
          "</tr>";
      }
      $("#projectinforlist").html(projectInfoHtml);
      
    }
异步

异步请求就当发出请求的同时,浏览器可以继续做任何事,Ajax发送请求并不会影响页面的加载与用户的操作,相当于是在两条线上,各走各的,互不影响。
一般默认值为true,异步。异步请求可以完全不影响用户的体验效果,无论请求的时间长或者短,用户都在专心的操作页面的其他内容,并不会有等待的感觉。

异步 --> 规划要做一件事情,但是不是当前立马去执行这件事情,需要等一定的时间,这样的话,我们不会等着他执行,而是继续执行下面的操作
–> “只有当下面的事情都处理完成了,才会返回头处理之前的事情;如果下面的事情并没有处理完成,不管之前的事情有没有到时见,都踏踏实实的给我等着”
–> 在JS中,异步编程只有四种情况:
–> 定时器都是异步编程的
–> 所有的事件绑定都是异步编程的
–> Ajax读取数据都是异步编程的,我们一般设置为异步编程
–> 回调函数都是异步编程的

代码演示
$.ajax({
          type: "post",
             async:true, //不设置此参数的话默认为true
                        url: "/teacher/ajaxtimeline",
                        data: {"month": month, "uid":<?php echo intval($teacher->uid);?>},
                        dataType: "json",
                        success: function(data) {
                            //假设data.canNotSetDays服务端返回的是[9,10,11]
                            $.each(data.canNotSetDays, function(i, item) {
                                canNotSetDays.push(item);
                            });
 
                            console.log('**********ajax result ************');
                            //此处是可以获取canNotSetDays的值的,并能查找到其中的元素数字9
                            console.log(canNotSetDays);
                            console.log(canNotSetDays.length);
                            console.log(canNotSetDays.indexOf(9));
 
                        }
                    });
 
                    console.log('***********after ajax ***********');
 
                    //此处是获取不到canNotSetDays的值的,长度为0,无法查找到其中的元素数字9
                    console.log(canNotSetDays);
                    console.log(canNotSetDays.length);
                    console.log(canNotSetDays.indexOf(9));
 
                    console.log('**********delay two seconds************');
 
                    setTimeout(function(){
                        //延迟2秒后也是可以获取canNotSetDays的值的,并能查找到其中的元素数字9
                        console.log(canNotSetDays);
                        console.log(canNotSetDays.length);
                        console.log(canNotSetDays.indexOf(9));
                    }, 2000);
<think>我们被要求回答关于AJAX同步异步的区别及工作原理的问题。根据引用资料,我们可以总结如下:1.**同步请求(Synchronous)**:-发送一个请求后,必须等待服务器响应结束(即请求完成)才能发送下一个请求。-在等待期间,用户不能进行其他操作,整个页面会被锁定(阻塞),用户体验较差。-同步请求会刷新整个页面。2.**异步请求(Asynchronous)**:-发送一个请求后,不需要等待服务器响应,可以继续发送其他请求。-通过回调函数处理服务器的响应,实现局部刷新(只更新页面的部分内容),不会阻塞用户操作。-用户体验更好,因为页面不会完全刷新,用户可以在等待服务器响应的同时继续与页面交互。**工作原理**:-AJAX通过`XMLHttpRequest`对象(现代浏览器中也可以用`fetch`API)与服务器进行异步通信。-基本步骤(四步操作):1.创建`XMLHttpRequest`对象。2.设置请求方法URL,并指定是否异步(通过`open`方法的第三个参数,`true`表示异步,`false`表示同步)。3.设置回调函数(通过`onreadystatechange`事件),在请求状态改变时处理响应。4.发送请求(`send`方法)。在回调函数中,我们检查请求的状态(`readyState`)响应的状态码(`status`),当请求完成且成功时(`readyState`为4,`status`为200),我们可以获取响应数据并更新页面的部分内容。**引用说明**:-引用[1][3]解释了同步异步的基本概念以及区别。-引用[3][4]详细描述了AJAX的工作原理,包括四步操作。-引用[2][5]提供了更多关于使用场景代码实现的信息。现在,我们按照要求生成相关问题。</think>### AJAX同步异步的区别及工作原理 #### **同步请求(Synchronous)** 1. **工作原理**: 发送请求后,浏览器会**阻塞用户操作**,必须等待服务器返回完整响应才能继续执行后续代码。期间页面处于“冻结”状态。 代码示例: ```javascript let xhr = new XMLHttpRequest(); xhr.open('GET', '/api/data', false); // 第三个参数false表示同步 xhr.send(); console.log(xhr.responseText); // 需等待响应完成后才执行 ``` 2. **核心特点**: - 阻塞式交互,用户体验差 - 刷新整个页面 - 适用场景:需严格顺序执行的操作(如支付确认)[^3][^5] --- #### **异步请求(Asynchronous)** 1. **工作原理**: 通过事件驱动模型实现非阻塞通信: - 创建`XMLHttpRequest`对象 - 绑定`onreadystatechange`回调函数 - 服务器返回数据后触发回调,局部更新DOM ```javascript let xhr = new XMLHttpRequest(); xhr.open('GET', '/api/data', true); // true表示异步 xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { document.getElementById("content").innerHTML = xhr.responseText; // 局部刷新 } }; xhr.send(); console.log("请求已发送,无需等待"); // 立即执行 ``` 2. **核心特点**: - 非阻塞式交互,用户可继续操作页面 - 仅刷新局部内容(如动态加载评论) - 通过回调函数/`Promise`处理响应[^1][^4] --- #### **关键区别总结** | **特性** | 同步请求 | 异步请求 | |----------------|----------------------------|----------------------------| | **用户体验** | 页面卡顿,操作被阻塞 | 流畅,用户可继续交互 | | **刷新范围** | 整个页面重载 | 局部DOM更新 | | **代码执行** | 顺序执行,需等待响应 | 非阻塞,回调函数处理结果 | | **适用场景** | 强依赖顺序的操作(如表单提交)| 动态加载数据、实时搜索等[^2] | #### **AJAX技术本质** 基于`XMLHttpRequest`对象(或现代`fetch API`),利用JavaScript在后台与服务器交换数据,实现**无刷新更新页面**。其异步模式通过事件循环机制实现:当主线程发送请求后,由浏览器网络线程处理通信,响应到达后通过回调函数通知主线程[^4][^5]。 > 优势:提升用户体验,减少带宽消耗; > 局限:增加服务器压力,SEO不友好[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值