jquery ajax同步和异步的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery ajax同步和异步的区别相关的知识,希望对你有一定的参考价值。

AJAX异步和同步区别

  AJAX
  1、AJAX(Asynchronous javascript And XML)
  主要由javascript和xml两种技术以一种新的方式组合成一门客户端技术.
  AJAX:Dhtml+XMLHttpRequest(可用于发送异步请求)
  DWR:ajax框架
  AJAX:Asychronized JavaScript +XML的缩写
  AJAX是一种客户端技术,可以和J2ee、.Net等服务器端技术进行交互。
  AJAX并不是一门新的技术,它是有很多已有的技术按一定的方式组合起来的:
  1)HTML,CSS实现标准的显示
  2)DOM(Document Object Module)实现动态交互
  3)XML,XSLT实现数据获取
  4)XMLHttpRequest发送异步请求,获取异步数据
  5)JavaScript将各种技术粘合起来
  2、同步请求应答通信模型详解
  传统web应用采用click-->wait-->refresh方式与用户交互.采用同步请求/响应的交互模式页面驱动,
  以页面为中心,即使请求前后的两个页面非常类似,服务器也要重新发送.
  browse-->request-->server-->response
  会打断用户的操作,因客户端每次操作后都要等待服务器的响应.刷新页面会丢失用户信息,光标位置不
  能对用户的请求做出立即的响应.由于HTML的限制,很多特殊效果很难实现.
  富客户端的应用:
  Applet,Macromedia Flash,Java WebStart,DHtml,DHtml with Hidden IFrame,AJAX
  3、使用目的
  解决了同 步请求应答通信模型 ( request/response 通 信模型 ) 的一些缺点:
  1) 页面先前的内容丢失
  2) 用户的下一步操作被中断
  3) 页面信息进行局部更新时,整个页面要全部刷新.
参考技术A

同步,异步的难理解,我觉得本身是因为这两个词语在汉语中的解释与计算机中完全不同

说说我理解的同步,异步

比如说,LiLei今天约了HanMeiMei 进天来他家吃烤面包

于是LiLei有这么几件事需要做

    烤面包,

    煮茶,

    打扫房间

他该怎么去完成这几件事情呢

ex1:先打扫房间,打扫完成,烤面包,等到面包考好了,煮茶

ex2:先准备烤面包,恩,把面包放入烤箱,设个定时提醒,去煮茶,把水烧着,水烧开了,电磁炉会响,去打扫房间,打扫完了,面包也许考完了,水也许烧开了,我可以继续煮茶,也可以继续做其他的事情。

ex1,就是同步

ex2,就是异步

这与汉语中的并行,串行有相似,但是在计算机中并行与串行与同步,异步是不同的概念

异步还涉及到回调等等

嗯,就是这样的

本回答被提问者和网友采纳
参考技术B $.ajax( 
         type: ..., 
        url:.., 
        async:false, //默认是true:异步,false:同步。
 );

 alert("测试同步与异步");

就拿上面的例子说:如果是异步的话,不管ajax的执行请求有没有返回,代码会继续往下执行,

如果是同步的话,只有ajax请求完成返回数据之后代码才能继续往下执行

参考技术C 说的简单点,跟你举个例子
比方你在烤面包,当你把面包放进烤面包机里边,然后你就一直在哪儿傻等着,一直等到面包烤好了你取出面包再开始做下面的事情这个就是同步。
异步的话就是你不等面包烤好,把面包放进烤面包机之后你就去做其他事情去了,当烤面包机一声铃响提示你烤好了,你取出面包再开始做下面的事情这个就是异步。
ajax的异步和同步也是同样道理
参考技术D 同步需要等待返回结果才能继续,异步不必等待,一般需要监听异步的结果
同步是在一条直线上的队列,异步不在一个队列上 各走各的

什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax



什么是Ajax


Ajax即Asynchronous Javascript And XML(异步JavaScript和XML) 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

Ajax实质是利用浏览器提供的对象(XMLHttpRequest) ;异步地向服务器发送请求服务器返回部分数据,浏览器使用这些数据对页面做部分的更新,整个过程页面无刷新,不打断用户的操作。


同步异步概念


同步: 当客户端与服务器交互时,不能进行其他操作,需要等服务器响应数据过来;在这个过程中,客户端的操作会被打断; 而且服务器响应的过来时会刷新数据;

异步:客户端与服务器交互时,客户端还可以进行其他操作,客户端使用的是XMLHttpRequest对象与服务器交互的,那么服务器在响应时也是通过这个对象将提示信息返回,将信息更新到页面,页面不刷新.

例如,用户正在填写某个注册的表单,信息已经全部填写了,但是点击注册后,由于数据库中已存在了这个账户名,返回给用户信息提示时,用户之前填写的所有数据都被刷新清除了.
这要是用异步交互,那么用户填的数据就不会被全部清除了.


同步异步实例案例

(1)同步:

用户实体类User

public class User {
    //Id
    private int uId;
    //用户名;
    private String account;
    //密码
    private String password;
     //性别
    private String sex;
    //年龄;
    private int age;
    //电话;
    private String mobile;

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
     public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public int getuId() {
        return uId;
    }

    public void setuId(int uId) {
        this.uId = uId;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

数据访问交互层UserDao;
其中用到了自定义的JDBC工具类

public class UserDao {
    //连接对象connection;
    Connection connection = null;
    //执行查询语句的PreparedStatement;
    PreparedStatement pst = null;
    //查询的结果集;
    ResultSet resultSet = null;

    /**
     * 根据管理员账号查询管理员;
     */
    public User findAdminByAccount(String account)throws SQLException{
        User user=null;
        try{
            //加载数据库驱动;
            connection=JdbcUtils.getConnection();
            //定义SQL语句
            String sql="select Id,account from tb_admin where account=? ";
            //预编译;
            pst=connection.prepareStatement(sql);
            //向占位符 ? 赋值;
            pst.setString(1,account);
            //获取结果集;
            resultSet= pst.executeQuery();
            while (resultSet.next()){
                user=new User();
                user.setuId(resultSet.getInt("Id"));
                user.setAccount(resultSet.getString("account"));
            }
        }finally {
            //关闭资源;
            JdbcUtils.closeSource(connection,pst,resultSet);
        }
        return user;
    }
 }

Jdbc工具类

public class JdbcUtils {

    static {
        try {
            //在Web项目中仅加载一次驱动;
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //关闭资源的方法;
    public static void closeSource(Connection connection, PreparedStatement ps, ResultSet resultSet) throws SQLException {
        //若不为空就关闭资源;
        if (connection != null) {
            connection.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (resultSet != null) {
            resultSet.close();
        }
    }
}

用到的Ajax01Servlet类;用于数据的获取,验证,以及跳转页面.

//使用反射;
@WebServlet(name = "byAjax01",urlPatterns = "/byAjax01")
public class Ajax01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取到账号信息;
        try {
            String account = req.getParameter("account");

            //新建数据交互层对象;
            UserDao userDao=new UserDao();
            //根据账号密码--查询到管理员;
            User adminByAccount = userDao.findAdminByAccount(account);
            //判断是否与数据库中的用户相同;
            if (adminByAccount==null) {
                //账号唯一,提示;
               req.setAttribute("errorMsg","☺,账号唯一,可注册.");
            } else {
                //若不是数据库中的账号,给出提示;
                req.setAttribute("errorMsg", "该账号已被注册");
            }
            //将页面请求转发到原来的页面.jsp;
            req.getRequestDispatcher("ajax/studyAjax01.jsp").forward(req,resp);
        }catch (Exception e){
            e.printStackTrace();
            //若异常,则跳转到预先设置的异常页面;
            resp.sendRedirect("404.jsp");
        }
    }
}

显示页面jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //账号失去焦点时就把其中的账号数据返回到servlet层.
            location.assign("${pageContext.request.contextPath}/byAjax01?account="+account);
        }
    </script>
</head>
<body>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
<%--onblur:标签失去焦点时触发;--%>
账号:<input type="text" name="account" onblur="getAcc(this.value)">
<%--errorMsg,验证消息后返回的信息--%>
${errorMsg}<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

在启动服务器后,输入账号,鼠标离开账号框,数据就和数据库中的账号数据进行验证,弹出提示消息,但是页面已经被刷新,前面填的数据已经没了.响应过来整个页面


(2)异步

用到的Ajax02servlet类

//使用反射;
@WebServlet(name = "byAjax02",urlPatterns = "/byAjax02")
public class Ajax02Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取到账号信息;
        try {
            String account = req.getParameter("account");

            //新建数据交互层对象;
            UserDao userDao=new UserDao();
            //根据账号密码--查询到管理员;
            User adminByAccount = userDao.findAdminByAccount(account);
            
            //设置响应的内容以及编码方式;
            resp.setContentType("text/html;charset=UTF-8");
            //使用流的方式返回信息;
            PrintWriter out= resp.getWriter();
            //判断是否与数据库中的用户相同;
            if (adminByAccount==null) {
                //账号唯一,提示;
                out.print("☺,账号唯一,可注册.");
            } else {
                //若不是数据库中的账号,给出提示;
                out.print("该账号已被注册");
            }
        }catch (Exception e){
            e.printStackTrace();
            //若异常,则跳转到预先设置的异常页面;
            resp.sendRedirect("404.jsp");
        }
    }
}

显示的jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //新建XMlHttpRequest对象;
            var httpRes=new XMLHttpRequest();
            //建立与服务器的连接;
            // open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
            //第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
            httpRes.open("get","${pageContext.request.contextPath}/byAjax02?account="+account,true);
            //发送请求;
            httpRes.send();
            //获取响应过来的数据信息;
            //onreadystatechange:指定回调函数
            httpRes.onreadystatechange=function (){
                //readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
                //readyState为4:表示读取响应结束;
                //status:HTTP的状态码;这里判断为200是正常状态码;
                if(httpRes.readyState==4 && httpRes.status==200){
                    //responseText:获得响应的文本内容;
                    document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
                }
            }
        }
    </script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

启动服务器;账号数据验证后,并未刷新清除前面的数据;仅响应提示信息


XMLHttpRequest对象


通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。

常用方法

open(method,URL,async)
该方法用来建立与服务器的连接;
第一个参数method:请求方式;为GET/POST;
第二个参数URL:指定请求的地址;
第三个参数async:指定是否使用异步请求;为布尔值(true/false)

send(content)
用来发送请求的方法;
content:指定请求参数;

setRequestHeader(header,value)
设置请求的头信息

在返回服务器响应的数据信息时,需要触发回调函数onreadystatechange;


常用属性

使用responseText获取响应的文本内容

可根据需要使用就绪状态码进行判断.
readyState: XMLHttpRequest的状态信息 ;就绪状态码.

就绪状态码注释
0XMLHttpRequest对象未完成初始化
1XMLHttpRequest对象开始发送请求
2XMLHttpRequest对象请求发送完成
3XMLHttpRequest对象开始读取响应,没有结束
4XMLHttpRequest对象读取响应结束

还可以根据HTTP状态码status进行判断

常用状态码说明
200服务器响应正常
400无法找到请求资源
403无权限访问
404访问资源不存在
500服务器错误

使用Ajax时,GET与POST请求方式的区别


  • Get方式提交时,建立连接后,仅需要发送请求即可;

例如:
XMLHttpRequest对象.open(“GET”,“Servlet?name=”+数据信息,true);
XMLHttpRequest对象.send(null);

  • Post方式提交时,建立连接后,需要设置http的请求头,然后才发送请求.

例如:
XMLHttpRequest对象.open(“POST”,“Servlet”,true);
设置请求头时,内容提交方式为表单的默认提交方式.
XMLHttpRequest对象.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);
XMLHttpRequest对象.send(“name=”+数据信息);

这里设置请求头时的值:“application/x-www-form-urlencoded”;
这是enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码;默认的表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)

在上面同步异步案例中,已使用get请求方式;
现在试试post方式. ;注意servlet那边是doPost方法接收.

<%--异步    使用POST方式提交  ;注意servlet端--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        function getAcc(account){
            //新建XMlHttpRequest对象;
            var httpRes=new XMLHttpRequest();
            //建立与服务器的连接;
            // open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
            //第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
            httpRes.open("POST","${pageContext.request.contextPath}/byAjax03",true);

            //设置请求头;
            httpRes.setRequestHeader("content-Type","application/x-www-form-urlencoded");
            //发送请求;
            httpRes.send("account="+account);
            //获取响应过来的数据信息;
            //onreadystatechange:指定回调函数
            httpRes.onreadystatechange=function (){
                //readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
                //readyState为4:表示读取响应结束;
                //status:HTTP的状态码;这里判断为200是正常状态码;
                if(httpRes.readyState==4 && httpRes.status==200){
                    //responseText:获得响应的文本内容;
                    document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
                }
            }
        }
    </script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男"><input type="radio" name="sex" value="女"><br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>

启动服务器,URL并未出现参数.


在java对象中封装了数据;想要传递给Ajax这边;
而XMLHttpRequest对象属于JavaScript;
之前上面是传递的文本信息,可以实现;
但是,两种语言需要数据交换;两个不同的对象数据;就得需要一个中间的转换格式;
那么,引入JSON这个概念.


什么是JSON


JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据;

约定大于配置

例如:
[ { 属性 : 值 , 属性 : 值 } , { 属性 : 值 ,属性 : 值 } ]

  • 数据存在键值对中
  • 多个数据使用逗号分隔
  • 大括号保存对象
  • 方括号保存数组


案例:根据Id查询用户信息,且其中将java对象先转为json格式的字符串,然后再把json格式的字符串转为javaScript对象;

  • 用户实体类User省略…
  • 数据访问层userDao;
public class UserDao {
    //连接对象connection;
    Connection connection = null;
    //执行查询语句的PreparedStatement;
    PreparedStatement pst = null;
    //查询的结果集;
    ResultSet resultSet = null;
    /**
     * 根据用户Id查询单个用户;
     */
    public User findUserById(String id) throws SQLException{
        //创建用户对象;
        User user=new User();
        try{
            //加载驱动,获取连接;
            connection=JdbcUtils.getConnection();
            //定义SQL语句;
            String sql="SELECT * " +
                    "FROM tb_admin " +
                    "WHERE id=?";
            //预编译;
            pst=connection.prepareStatement(sql);
            //为占位符赋值;
            pst.setString(1,id);
            //获取结果集;
            resultSet=pst.executeQuery()以上是关于jquery ajax同步和异步的区别的主要内容,如果未能解决你的问题,请参考以下文章

AJAX中同步和异步的区别和使用场景

ajax同步与异步的区别

什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax

jquery的ajax同步和异步

同步请求和异步请求区别

js中请求数据的$post和$ajax区别(同步和异步问题)