zoukankan      html  css  js  c++  java
  • 简单理解XHR、Ajax、Axios、Promise

    什么是异步请求?
    请求:客户端向服务器请求数据!

    无异步请求:在完整网页上发送任何请求,都会导致整个页面的全部刷新!

    有异步请求:可以实现网页的局部刷新!

    如何查看网页的异步请求(XHR)?
    F12=>Network=>XHR,刷新页面我们可以看到网页所有的XHR(XMLHttpRequest)请求

     

    XHR(XMLHttpRequest)是什么?
    XHR是浏览器提供的API,通过该API,简化了异步通信的过程。XHR可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。

    如何用原生的XHR发送get请求?

     // 1.创建XHR对象实例
      const XHR = new XMLHttpRequest();
     // 2.设置请求方式,请求地址
      XHR.open('get', 'http://127.0.0.1:3001/getHeroSkin');
     // 3.发送请求
      XHR.send();
     // 4.接收服务器响应
      XHR.onload = function () {
       console.log(XHR);
       console.log(XHR.responseText);//json格式的字符串
       const res = JSON.parse(XHR.responseText);//解析为字符串
       console.log(res);
      }

    如何用原生的XHR发送post请求?

           // 1.创建XHR对象实例
            const XHR = new XMLHttpRequest();
          // 2.设置请求方式,请求地址
            XHR.open('POST', 'http://127.0.0.1:3001/addHero');
            //3.设置发送的请求内容格式,本次发送的内容为键值对内容故要设置
            XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
             // 3.发送请求键值对内容
            XHR.send('name=小黄人&gender=男');
           // 4.接收服务器响应 
            XHR.onload = function () {
                console.log(XHR);
                console.log(XHR.responseText);
                const res = JSON.parse(XHR.responseText);
                if (res.code == 200) {
                    console.log('请求成功');
                }
            }

    如何用原生XHR自定义Ajax函数?

     function ajax(options) {
                //1.如果请求的方式没有传值,默认为GET
                if (!options.type) options.type = 'GET';
                // 2.如果url属性没有传值,退出函数
                if (!options.url) return console.log('url为必传参数');
                // 3.请求方式转换成大写(分支判断用到)
                options.type = options.type.toUpperCase();
     
                //4.1创建XHR实例
                const XHR = new XMLHttpRequest;
                //通过newURLSearchParmas把对象转化成查询参数字符串
                const params = new URLSearchParams(options.data).toString();
                //判断请求的方式
                if (options.type === "GET") {
                    console.log('发送GET请求');
                    // 4.2设置请求的方式和地址
                    // GET请求,带参数和不带参数写法
                    //GET带参数
                    if (params) {
                        XHR.open(options.type, options.url + '?' + params)
                    }
                    //不带参数
                    else {
                        XHR.open(options.type, options.url);
                    }
                    //4.3发送请求
                    XHR.send();
     
                    // POST请求,带参数和不带参数的写法
                } else if (options.type === "POST") {
                    console.log('POST请求');
                    //   5.1POST请求方式和请求地址
                    XHR.open(options.type, options.url);
                    // 5.2POST请求所需的内容类型设置
                    XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
                    // 5.3POST请求参数需要写道send中
                    XHR.send(params);
                }
     
                XHR.onload = function () {
                    const res = JSON.parse(XHR.responseText);
                    // 6.调用success回调函数,把转换后的res作为实参传递出去
                    if (typeof options.success === 'function') options.success(res);
                }
                console.log(options);
            }
     
     
    //自定义函数调用
           ajax({   type: 'post',
                    url: 'http://127.0.0.1:3001/addHero',
                    data: { name: '刘备', gender: '女' },
                    success: (res) => {
                        console.log(res);
                    }})
    

      

    axios和ajax的区别?
    axios是通过promise实现对ajax的二次封装

    为什么要进行二次封装?

    ajax缺点:如果要发送两个不同请求,请求有先后顺序(第二个请求需要基于第一个请求的数据)

    这时在一个ajax请求里面,我们要不停的嵌套ajax请求,有多少请求,就要嵌套多少层

    利用promise封装后的优点?

    可以把每一次请求到的数据,赋值出来

    const result= function (){
      return new Promise((resolve,reject)=>{
           ajax({ url: '请求地址',
                 success: (res) => {
      //resolve()可以直接把数据return出来
                 resolve(res.data)
                 }})
     
     })
     
    }
     
    //函数封装
    const axios= (parims) => {
     
      return new Promise((resolve,reject)=>{
     
           ajax({ url: parims.url,
                 success: (res) => {
                 resolve(res.data)
                 }})
     
     })
    }
    //函数的调用
     let res1 = await axios({
              url: '请求地址'
        })
     
    //函数调用
    await是异步等待的意思,表示要等此行代码执行完才能执行下面的代码,很好地解决了多次请求需要多次嵌套地缺点。
     
    

      

  • 相关阅读:
    docker log
    byte转String防止乱码
    SQL索引
    Redis 总结精讲
    如何保证消息队列是高可用的
    消息中间件(一)MQ详解及四大MQ比较
    @Bean和@Componet区别
    理解Spring的AOP和Ioc/DI就这么简单
    SpringBoot 基础
    《Linux 鸟哥私房菜》 第6章 Linux的文件权限与目录配置
  • 原文地址:https://www.cnblogs.com/xuzhenlei/p/15700367.html
Copyright © 2011-2022 走看看