Ajax、Promise、Axios前端三剑客

news2024/12/25 23:38:43

文章目录

  • 🐳前言
    • 关系二维表:
  • 🐳Ajax
    • 定义:
    • 特点:
    • 🐡核心对象XMLHttpRequest:
      • XMLHttpRequest对象的五种状态:
    • 使用:
      • 1.Jquery的ajax:
      • 2.Vue的ajax:
  • 🐳Promis
    • 定义:
    • 特点:
    • 🐡PromiseState(状态):
    • 使用:
    • Promise的函数使用
      • 1.Promise.resolve(value);
      • 2.Promise.reject(reason);
      • 3.Promise.all(promises);
      • 4.Promise.race(promises);
    • Promise和Ajax结合
    • 扩展:async函数和await表达式
      • async和await结合
  • 🐳Axios
    • 定义:
    • 特点:
    • 安装:
    • 使用:
      • 方法一:
      • 方法二:
    • 🐡Axios配置:
      • 默认配置——axios.defaults:
    • 🐡axios拦截器interceptors
      • 请求拦截器:
      • 响应拦截器:
        • 使用拦截器后的axios请求:
    • 什么时候会请求失败、什么时候响应失败呢?
    • 取消请求Cancel():
  • 🐳总结

🐳前言

  Ajax、Promise和Axios是三个在Web开发中经常使用的工具/技术。
  它们三个有一定的发展历史,首先出现的是Ajax,Ajax解决了更新或提交页面需要加载整个页面的问题,提供了一种异步调用的方式;而Promise针对异步调用的繁琐代码给出了一个优雅的编写风格;Axios则包含了两者,即可以方便的发送HTTP请求,又结合Promise的特性来处理异步操作。

关系二维表:

-AjaxPromiseAxios
定义异步通信技术异步操作处理对象基于Promise的HTTP客户端
年份2005年2010年2014年
核心思想使用JavaScript和XMLHttpRequest对象提供一种优雅的方式处理异步操作提供简洁的API发送HTTP请求
作用实现在不刷新整个页面的情况下与服务器通信改进异步操作处理方式发送HTTP请求
支持通过原生JavaScript实现ES6标准引入Promise提供直接使用的API


🐳Ajax

定义:

  Ajax(Asynchronous Javascript And XML),翻译为异步的js和xml,它不是编程语言,是一项web应用程序技术。

特点:

  1. 异步通信
    • 发送请求后,程序并不会等待响应结果,而是会继续往下运行
    • 所以,必须要在ajax状态监听的回调函数中,才能保证获取响应数据
  2. 刷新数据而不会加载整个页面
    • 不用Ajax:更新或提交内容——需要重新加载整个网页
    • 使用Ajax:更新或提交内容——只更新部分网页
  3. 无需插件
    • 使用纯粹的JavaScript和浏览器内置的XMLHttpRequest对象

🐡核心对象XMLHttpRequest:

  xhr,全称为XMLHttpRequest,用于与服务器交互数据,是ajax功能实现所依赖的对象。
  当客户端发出请求时,请求数据发送给XMLHttpRequest而不是直接发送给服务器。而且请求是异步发送的。并且,服务器不在将数据直接返回给客户端浏览器,而是返回给XMLHttpRequest对象。

  XMLHttpRequest可以实现客户端与服务器只进行数据层面的交互,而不是视图层面的交互。

XMLHttpRequest对象的五种状态:

  • 0(未初始化)还没有调用send()方法
  • 1(载入)已调用send()方法,已建立服务器连接
  • 2(载入完成)send()方法执行完成,已经接收到全部响应内容
  • 3 (交互)正在解析响应内容
  • 4(完成)响应内容解析完成,可以在客户端调用了

使用:

  JQurey、vue等框架包装了Ajax

1.Jquery的ajax:

  默认是get请求
  success:载入成功时的回调函数

<html>
<head>
    <title>ajax</title>
    <script type="text/javascript" src="statics/js/jquery-3.4.1.js"></script>
    <script>
        /*
            jQuery.post(...)
            所有参数:
            urL:待载入页面饥URL地址(必填)
            data:待发送Key/value参数
            success:载入成功时回调函数
            data:请求返回的数据
            status:清求返回的状态
         */
        function a1() {
            $.ajax({
                url: "ajax/a1",
                data: {"name": $("#txtName").val()},
                success: function (data, status) {
                    alert(data);
                    alert(status);
                }
            })
        }
    </script>
</head>

<body>
用户名:<input type="text" id="txtName" onblur="a1()">
</body>
</html>

  post请求:

<script type="text/javascript" src="statics/js/jquery-3.4.1.js"></script>
<script>
    $(function () {
        $("#btn").click(function () {
            $.post("ajax/a2", function (data) {
                console.log(data);
                $("#content").html(html);
            })
        })
    })
</script>

2.Vue的ajax:

  • readyState属性:代表了 XMLHttpRequest对象的状态
  • onreadystatechange事件:能够监听XMLHttpRequest对象的状态变化
//创建XMLHttpRequest核心对象
let xhr = new XMLHttpRequest();
//open()方法来完成Http请求(get方式)
xhr.open("get", "http://api.tianapi.com/txapi/ncovcity/index?key=自己的key");
//向服务器发送请求
xhr.send(null);
//使用onreadystatechange事件监听XMLHttpRequest对象状态。
xhr.onreadystatechange = function() {
    //readyState属性代表了 XMLHttpRequest对象的五种状态。4状态为响应内容接收并解析完成
    if (xhr.readyState == 4) {
        //http请求会返回一个状态码。200为请求成功。
        if (xhr.status == 200) {
            //xhr.responseText就是服务器端返回的数据
            console.log(xhr.responseText);
        }
    }
};


🐳Promis

定义:

  Promise是js实现异步编程的一个解决方案,是ES6规范下的一门新技术,本质是个构造函数。
  很多异步任务都是使用回调函数实现的,包括Ajax,promise提供了一种优雅的处理回调的方式。
在这里插入图片描述

特点:

  1. 支持链式调用,解决回调地狱问题(回调里套异步任务,错误处理会重复)
    • promise启动异步任务会返回promise对象,给这个对象绑定回调函数
  2. promise本身是一个构造函数,可以包裹一个异步操作(异步操作之外的代码是同步执行的)

🐡PromiseState(状态):

  PromiseState是promise对象中的一个属性
  状态的初始值是pending,并且状态只能改变一次

  1. pending 未决定的(初始状态)
  2. resolved/fullfilled 成功
  3. rejected 失败
    在这里插入图片描述

使用:

  Promise构造函数内有两个函数类型的参数:

  1. resolve:翻译为解决,在Promise内部的异步操作成功时调用,作用是修改Promise对象的状态为成功
  2. reject:翻译为拒绝,在Promise内部的异步操作失败时,作用是修改Promise对象的状态为失败
const p =new Promise((resolve,reject)=>{
	//promise内部可以包裹一个异步任务,这里包裹了一个定时器
    setTimeout(()=>{
        let n=rand(1,100);
        if(n<=30){
            resolve(n);  //异步任务成功,执行resolve函数(可以给回调传参,不传也行)
        }else{
            reject(n);   //异步认真执行失败,执行reject函数 
        }        
    },1000);
});

  现在已经实例化了一个Promise类型的对象p,这个p的状态,取决于内部的异步任务的逻辑。

  • p.then方法:根据Promise对象的状态,自动选择调用第一个回调(成功)还是第二个回调(失败)
  • p.catch方法:只在状态为失败时执行
//调用then方法 ,箭头函数的参数只有一个,可以不写小括号,也可以写
p.then(value=>{
    alert('p的状态为成功时才执行——————————恭喜中奖,号码是:'+value);
},(reason)=>{
    alert('p的状态为失败时才执行——————————再接再厉,号码是:'+reason);
});
p.catch(reason=>{
    alert('p的状态为失败时才执行——————————再接再厉,号码是:'+reason);
})

  可以写多个then方法,都会执行:
在这里插入图片描述
  链式调用实现的异常穿透:
在这里插入图片描述

Promise的函数使用

  不创造Promise对象,也可以直接使用Promise的几个方法

1.Promise.resolve(value);

  value的值:

  • value为非promise类型的对象,则状态为成功;
  • value为promise对象,则看promise对象的状态
    在这里插入图片描述

2.Promise.reject(reason);

  返回一个状态为失败的promise对象
  reason的值:

  • reason的值是什么,失败的结果就是什么

3.Promise.all(promises);

  返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败
  promises的值:

  • 包含n个promise的数组

4.Promise.race(promises);

  返回一个新的promise,.第一个完成的promise的结果状态就是最终的结果状态
  promises的值:

  • 包含n个promise的数组

Promise和Ajax结合

const p=new Promise((resolve,reject)=>{
    //创建XMLHttpRequest核心对象
    let xhr = new XMLHttpRequest();
    //open()方法来完成Http请求(get方式)
    xhr.open("get", "http://api.tianapi.com/txapi/ncovcity/index?key=自己的key");
    //向服务器发送请求
    xhr.send(null);
    //使用onreadystatechange事件监听XMLHttpRequest对象状态。
    xhr.onreadystatechange = function() {
        //readyState属性代表了 XMLHttpRequest对象的五种状态。4状态为响应内容接收并解析完成
        if (xhr.readyState == 4) {
            //http请求会返回一个状态码。200为请求成功。
            if (xhr.status == 200) {
                //xhr.responseText就是服务器端返回的数据
                resolve(xhr.responseText);
            }else{
                reject(xhr.responseText);                
            }
        }
    };
})

p.then(value=>{console.log(value)},reason=>{console.warn(reason)})

扩展:async函数和await表达式

  • async函数:返回值为promise对象
  • await表达式:await右侧的表达式可以为promise对象,如果是promise对象,则返回的是成功的值

async和await结合

看不到回调函数,非常简洁
在这里插入图片描述
在这里插入图片描述



🐳Axios

定义:

  axios是目前前端最流行的Ajax请求库,是基于promise的Http客户端,可以运行在浏览器和node.js上。它的返回类型是promise类型的对象

特点:

  1. 浏览器可以借axios向服务器发送ajax请求
  2. node.js可以借助axios向远端发送http请求
  3. 支持promise相关操作
  4. 可以拦截请求和响应
  5. 对请求和响应数据做转换
  6. 取消请求
  7. 自动将结果转为json

安装:

在这里插入图片描述

使用:

  除了可以用axios函数发送请求,还可用axios.get、axios.post等axios对象的方法发送请求
  then很眼熟吧,说明返回的是promise类型的对象


  使用前实例化axios对象
const axios = axios.create({
    axios.fedaults.timeout=3000;
})

方法一:

在这里插入图片描述
在这里插入图片描述

方法二:

在这里插入图片描述

🐡Axios配置:

  • url:请求地址
  • method:请求类型
  • baseURL:设定url的基础结构,axios内部会自动把baseurl拼在url前面
  • transformRequest:对请求的数据做一些处理,处理完了再发送给服务器
  • transformResponse:对响应的结果做一些改变
  • headers:对请求头信息做一些控制
  • params:设置url参数
  • paramsSerializer:对请求的参数做序列化
  • data:请求体,如果是对象,则自动转化为字符串
  • timeout:请求时间(毫秒),如果超出时间,请求将被取消

默认配置——axios.defaults:

  对重复配置的统一编写,写法就是基础配置前加axios.fedaults

  • axios.fedaults.method=‘GET’;
  • axios.fedaults.baseURL=‘http://localhost:3000’;
  • axios.fedaults.timeout=3000;
  • axios.fedaults.params={id:100};

  如果有多个环境,可以创建多个axios对象

const axiosA = axios.create({
    axios.fedaults.baseURL='http://a.com:3000';
    axios.fedaults.timeout=3000;
})

const axiosB = axios.create({
    axios.fedaults.baseURL='http://b.com:3000';
    axios.fedaults.timeout=3000;
})
用法一:
axiosA ({
    url:'/xxx',
}).then(response=>{
    console.log(response);        
})
用法二:
axiosB.get('/xxx').then(response=>{
    console.log(response);
})

🐡axios拦截器interceptors

  • 有两个回调,成功和失败,这是因为本质是promise的then方法来的
  • then方法可以写多个,拦截器也可以设置多个,执行顺序是:
    • 请求拦截器先进先执行
    • 响应拦截器后进先执行

先创建axios对象

const axios = axios.create({
  XXXXXX:xxxxxxx;
});

请求拦截器:

  config:axios的配置对象,所以可以在这里对配置进行调整

axios.interceptors.request.use(function (config){
    console.1og('请求拦截器成功');
    return config;
}function (error){
    console.1og('请求拦截器失败');
    return Promise.reject(error);
);

响应拦截器:

  响应的结果,在这里可以对结果进行判断

axios.interceptors.response.use(function (response){
    console.1og('响应拦截器成功')
    return response;
}function (error){
    conso1e.1og('响应拦截器失败')
    return Promise.reject(error);
);

使用拦截器后的axios请求:

axios({
    url:'/xxx',
}).then(response=>{
    console.log(response);//成功        
},err=>{
    console.log(err);//失败  
})

什么时候会请求失败、什么时候响应失败呢?

  请求失败的情况:

  • 网络错误:例如,网络连接中断、DNS解析失败、服务器无法访问等。
  • 超时:如果请求超过了指定的超时时间,将被视为请求失败。
  • 无效的URL:如果请求的URL无效或无法解析,请求将失败。
  • 请求被取消:如果在请求发送之前调用了cancel方法取消请求,请求将被标记为失败。

  响应失败的情况:

  • 抛出异常(throw “异常描述”)
  • 响应状态码错误:例如,HTTP状态码为4xx或5xx,表示请求出现了错误,如404(未找到)、500(服务器内部错误)等。
  • 响应超时:如果服务器在指定的时间内没有返回响应,请求将被视为响应失败。
  • 响应被取消:如果在接收到响应之前调用了cancel方法取消请求,响应将被标记为失败。
    在这里插入图片描述

取消请求Cancel():

  场景:判断上一次请求是否发送成功,如果成功了再发第二次请求,如果还在发送中则取消上一次请求。

//判断上一次的请求是否已经完成
let cancel = null;//声明全局变量
if(cancel!=null){
    cancel();//取消上一次请求
}
axios({
    method:'GET',
    url:'http://xxxx:3000/post',
    1、添加配置对象的属性
    cancelToken:new axios.CancelToken(function(c){
        //将c的值赋给cancel
        cancel = c;    
    })
}).then(response=>{
    console.log(response);
    //将cancel的值初始化
    cancel = null;
})


🐳总结

  Ajax是一种用于实现异步通信的技术,Promise是一种用于处理异步操作的对象,而Axios则是一个基于Promise的HTTP客户端,用于发送HTTP请求。它们的出现都是为了在Web开发中更好地处理异步操作和网络请求。系统性的学习这三项技术有助于提高你对前端技术的掌握。觉得有用就点个赞吧🐣

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#】GridControl增加选择列(不用二次点击)

系列文章 【C#】单号生成器&#xff08;编号规则、固定字符、流水号、产生业务单号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 【C#】日期范围生成器&#xff08;开始日期、结束日期&#xff09; 本文链接&#xff1a;h…

【FMC156】基于VITA57.1标准的2路2.5GSPS采样率16位分辨率直流耦合DA播放FMC子卡模块(DAC38J82)

产品概述 FMC156 是一款基于VITA57.1 标准规范&#xff0c;实现2 路2.5GSPS 采样率16 位分辨率直流耦合DAC 播放子卡模块。该模块遵循VITA57.1 标准&#xff0c;可直接与FPGA 载卡配合使用&#xff0c;板卡DAC 器件采用TI 公司的DAC38J82 芯片&#xff0c;该芯片提供4 个模拟输…

2023,有哪些适合网工跳槽的好公司?(不是BAT)

大家好啊&#xff0c;我的网工朋友 都说行业内卷&#xff0c;卷的不成人形&#xff0c;这内卷&#xff0c;一卷就卷了好几年。 很多网工同行都讨厌被卷来卷去&#xff0c;但是看到同行进了大厂&#xff0c;免不了还是要羡慕嫉妒恨一波。 作为主编几年&#xff0c;我就发现了…

注册ChatGPT时提示Oops! The email you provided is not supported

问题描述 今天本想出一个ChatGPT的注册与使用的教程&#xff0c;结果上来吃了个闭门羹。之前我通过微软账号登录验证是没有问题的&#xff0c;但这次想使用另一个微软账号&#xff0c;结果提示Oops! The email you provided is not supported&#xff08;您提供的电子邮件不支…

C# 给winfrom窗体添加皮肤控件

如何快速给C# winform添加好看的皮肤C# Winform中窗体的美化 SkinEngine的应用 皮肤控件换肤素材包&#xff0c;IrisSkin2.dll皮肤素材资源下载 压缩包内一共有22种皮肤素材&#xff0c;使用说明&#xff1a;把控件拖到你的form上&#xff0c;只需一行代码&#xff0c;即可实…

Ubuntu安装时没注册root用户密码,怎么登录root

一、Ubuntu设置root密码: 1.桌面空白处右键菜单 点击“打开终端“。 2.输入命令 "sudo passwd root

Cinema 4d 和 3ds Max:哪个软件更好?

3D 设计有很多挑战。设计师通常需要克服他们的看法和偏见&#xff0c;此外还要学习一些深入的程序来有效地使用 3D 风格的软件系统。市场上有很多用于3D设计的软件&#xff0c;因此对于哪一种对您的需求最有效会令人困惑。如果您不熟悉3D&#xff0c;或者您正在四处寻找新的软件…

数据进行分组后同一字段字符串连接方法

数据源如下&#xff1a;期望将同一个id_supplier_basic_info输出的supplier_type写在一行上&#xff0c;可以按‘/’分隔 一开始的时候使用的是但是一直提示找不到这个函数&#xff0c;一时陷入迷惑&#xff0c;难道是mysql不支持这个函数&#xff1f;但是百度明明都说mysql是支…

Mss32.dll丢失怎么办?怎么修复Mss32.dll文件

Mss32.dll丢失怎么办&#xff1f;如果你打开游戏或者应用程序时出现了如下错误提示&#xff1a;“找不到Mss32.dll”&#xff0c;那么你就需要解决这个问题。 Mss32.dll是一个动态链接库文件&#xff0c;它通常用于多媒体应用程序和游戏中的音频功能。如果该文件丢失或损坏&…

谷歌seo怎么做?2023做好谷歌seo的7个关键点

谷歌seo怎么做&#xff1f; 谷歌搜索引擎优化&#xff08;SEO&#xff09;是一系列的技术和策略&#xff0c;旨在通过改进网站结构、内容和其他因素&#xff0c;提高网站在搜索引擎结果页面&#xff08;SERP&#xff09;中的排名和可见性。以下是一些常用的谷歌SEO技术和策略&…

C语言——指针初阶

哈喽&#xff0c;大家好&#xff0c;今天我们来学习C语言中的指针&#xff0c;今天主要学习初阶指针&#xff0c;后期我们将继续学习指针进阶。 目录 1. 指针是什么 2. 指针和指针类型 2.1 指针-整数 2.2 指针的解引用 3. 野指针 3.1 野指针成因 3.2 如何规避野指针 4.…

苹果浏览器safari打不开网页怎么办?参考方法在这!

案例&#xff1a;为啥苹果自带的浏览器打不开网页&#xff1f;输入名称或者网址&#xff0c;打开的网页都是空白的。 【不知道怎么回事&#xff0c;我在safari浏览器里面输入网址&#xff0c;但是打不开正确的网页&#xff0c;一直打开的是空白网页。】 当您使用苹果自带的浏览…

构件连接器

构件连接器 1.构件连接器是什么 构件之间传递信息的器件称为构件连接器&#xff0c;简称为连接器。connector。 构件连接器就是在构件之间进行信息传递的通道&#xff0c;可以通过该通道实现信息由一个构件的端口传递 给另一个构件的端口或者是接口。 2.常见的连接器关系 委…

Python-PyEcharts绘制柱状图

更多优秀文章&#xff0c;请关注个人微信公众号&#xff1a; 程序猿小杨 Python-PyEcharts绘制柱状图 一、简介 核心创建流程&#xff1a; 1.通过Bar()构建一个柱状图对象 2.和折线图一样&#xff0c;通过add xaxis()和add_yaxis()添加x和y轴数据 3.通过柱状图对象的&#x…

Talk预告 | 香港中文大学博士生徐英豪:从不规则的单目图片数据构建3D生成模型

本期为TechBeat人工智能社区第498期线上Talk&#xff01; 北京时间5月18日(周四)20:00&#xff0c;香港中文大学博士生 — 徐英豪的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “从不规则的单目图片数据构建3D生成模型”&#xff0c;届时将介绍…

ipa怎么装到苹果手机

下面介绍ipa怎么装到苹果手机&#xff1f; 方法/步骤 进入手机上的设置&#xff0c;如下图所示&#xff1a; 在设置页面中&#xff0c;点击进入通用&#xff0c;如下图所示&#xff1a; 进入通用页面后&#xff0c;点击页面上的描述文件&#xff0c;如下图所示&#xff1a; …

软件测试基础知识整理(五)- 软件开发模型、测试过程模型

目录 一、软件开发模型 1.1 瀑布模型 1.1.1 特点 1.1.2 优缺点 1.2 快速原型模型&#xff08;了解&#xff09; 1.2.1 特点 1.2.2 优缺点 1.3 螺旋模型&#xff08;了解&#xff09; 1.3.1 特点 1.3.2 优缺点 二、测试过程模型 2.1 V模型&#xff08;重点&#xff…

chatgpt赋能Python-python3_6_4怎么用

Python3.6.4简介 Python3.6.4是Python编程语言的一个版本&#xff0c;于2017年12月19日发布。这个版本是Python3系列的一个重要更新版本&#xff0c;包含许多新的特性、改进以及Bug修复。 Python3.6.4有一个众所周知的特点&#xff1a;它是一个不断发展的语言&#xff0c;因此…

springcloud再次学习

对应版本关系&#xff0c;如果不对应可能会报错 在启动类配置&#xff0c;也可以在配置类配置 远程调用使用RestTemplate Eureka配置 步骤 Docker部署Eureka 先创建一个文件将打好的jar包文件去&#xff0c;再写一个Dockerfile文件 负载均衡 &#xff08;LoadBalanced&#xf…

【密码产品篇】动态口令系统密钥体系结构(SM3、SM4)

【密码产品篇】动态口令系统密钥体系结构&#xff08;SM3、SM4&#xff09; 动态口令是一种一次性口令机制&#xff0c;用户无须记忆口令&#xff0c;也无须手工更改口令。口令通过用户持有的客户端器件生成&#xff0c;并基于一定的算法与服务端形成同步&#xff0c;从而作为…