简单理解XHR、Ajax、Axios、Promise

本文介绍了异步请求的概念及其重要性,详细讲解了如何使用XMLHttpRequest(XHR)进行GET和POST请求,以及如何用原生XHR自定义Ajax函数。还探讨了axios与原生ajax的区别,指出axios是基于Promise的二次封装,解决了ajax请求的嵌套问题,提高了代码可读性和维护性。

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

什么是异步请求?

请求:客户端向服务器请求数据!

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

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

如何查看网页的异步请求(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是异步等待的意思,表示要等此行代码执行完才能执行下面的代码,很好地解决了多次请求需要多次嵌套地缺点。

再深入的话就是关于promise函数的封装了!

好的,下面分别为您介绍 **Axios**、**Ajax** 和 **Promise** 这三个概念及其之间的关联。 --- ### 一、Axios 是什么? Axios 是一个基于 `Promise` 的轻量级 HTTP 客户端库,支持浏览器和 Node.js 环境下的使用。它可以简化发送网络请求的过程,并具备许多强大的特性: - 支持 Promise 链式调用; - 自动将 JSON 数据转换成 JavaScript 对象; - 提供拦截器功能(可以在请求前或响应后处理数据); - 能够取消未完成的请求。 例如: ```javascript axios.get('https://jsonplaceholder.typicode.com/posts/1') .then(response => console.log(response.data)) .catch(error => console.error(error)); ``` 通过上述代码可以看出,Axios 基于 `Promise` 实现了异步操作链式的优雅语法,极大地提升了开发体验! --- ### 二、Ajax 是什么? Ajax (Asynchronous JavaScript and XML),即“异步 JavaScript 和 XML”,是一种网页开发技术,允许客户端与服务器之间交换少量数据而不刷新整个页面的技术手段之一。借助 Ajax 技术可以让 Web 应用程序更加高效地运行并与用户交互更为流畅自然。 传统的同步加载会阻塞后续脚本解析直到获取资源完毕为止;而采用 AJAX 后,则可以通过 XMLHttpRequest(XHR)对象实现后台静默通信从而避免此类情况发生。 简单XHR 示例如下所示: ```javascript let xhr = new XMLHttpRequest(); xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1"); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200){ let resData = JSON.parse(xhr.responseText); document.getElementById('output').innerHTML += `<p>${resData.title}</p>`; } else if (xhr.readyState != 4){ /* handle loading */ } }; xhr.send(null); ``` 虽然原生 XHR 功能强大但过于繁琐复杂难以维护调试不便等问题明显存在——正是由于这些问题催生出了像 Axios 这样的更高层次封装工具来替代原始做法。 --- ### 三、Promise 是什么? Promise 是一种用于管理异步任务的对象模型,它的作用在于提供了一种更清晰的方式来解决回调地狱问题。当某个事件完成后通知我们结果已准备好,并根据这个结果继续下一步行动。 每个 Promises 拥有三种状态之一:pending(进行中)、fulfilled(成功)或者 rejected(失败)。一旦进入 fulfilled/rejected 则不能再改变其最终结局只能等待新一轮启动新的实例再试一次。 以下是一个基本例子展示了如何创建及消费 promise: ```javascript new Promise((resolve, reject)=>{ setTimeout(() => resolve("Hello"), 1000) }) .then(message=>{console.log(message)}) .catch(err=>{throw err;}); // 输出: Hello after one second delay. ``` 正如前面提到过的那样,Axios 内部实现了 promises API 所以才能拥有如此简洁易读性强的优点. --- 综上所述:Ajax 描述的是整体思想模式,Promises 规定了控制流结构形式化表达方法论最后由具体框架如 Axios 结合两者优势为我们带来现代化解决方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值