相关文章推荐
果断的汤圆  ·  promise多并发请求方法_js ...·  4 周前    · 
精明的蜡烛  ·  SQL错误: 241,SQLState: ...·  1 年前    · 
风流的匕首  ·  Linux常用命令-解压缩篇 - 知乎·  2 年前    · 
茫然的海豚  ·  【tensorrt】——显卡对应的硬件能力与 ...·  2 年前    · 
狂野的小蝌蚪  ·  深入了解MMU是如何完成地址翻译的?【建议收 ...·  2 年前    · 
爱健身的马铃薯  ·  懂算法才能打“算法战” - 中华人民共和国国防部·  2 年前    · 
Code  ›  Ajax,Promise,Fetch,Axios的区别开发者社区
ajax 按钮 fetch promise
https://cloud.tencent.com/developer/article/2062654
爱旅游的佛珠
2 年前
作者头像
qiangzai
0 篇文章

Ajax,Promise,Fetch,Axios的区别

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 强仔博客 > 正文

Ajax,Promise,Fetch,Axios的区别

发布 于 2022-07-30 11:28:28
574 1
举报

Ajax,Promise,Fetch,Axios的区别

说起他们的区别我们首先要知道,js中什么是同步执行和异步执行?

在js中,通常情况下代码都是自上而下同步执行的,在同步执行代码时,如果有一段代码执行的速度特别慢,会造成程序卡顿的后果。再者常见的就是向 服务器 发送请求,需要花费时间接受服务器返回的响应结果,对数据进行处理,因为网速和加载速度慢的原因,会带来不好的用户体验。从而引入异步处理,使代码无需等待,继续处理其他代码,直到其他程序处理完毕,js再继续之前的工作

早期处理的思路

js中的一部主要是通过事件和回调函数实现的,但是这种方式会存在一些问题

//为了方便演示,页面创建button元素,使用原生的dom来发送请求,后面会用到
<button>点我发送请求</button>
document.querySelector("button").addEventListener("click", function () {});

会出现的问题

1.不能通过return设置返回值,

function fn1() {
        setTimeout(() => {
          console.log(1);
          // 以异步的方式,来给函数设置返回值
            return 'hello'
        }, 0);
        console.log(2);
      let result = fn1();
      console.log(result);

拿不到返回值,这时可以通过回调函数解决问题

function fn1(cb) {
        setTimeout(() => {
          console.log(1);
          // 以异步的方式,来给函数设置返回值
          cb("hello");
        }, 0);
        console.log(2);
      fn1((result) => {
        console.log(result);
      });

2.当异步过于复杂时,多个函数相互依赖时,就会造成回调地狱问题,增加代码复杂度,难以维护

      function fn1(n, cb) {
        setTimeout(() => {
          return cb(n + 1);
        }, 0);
      function fn2(n, cb) {
        setTimeout(() => {
          return cb(n + 2);
        }, 0);
      function fn3(n, cb) {
        setTimeout(() => {
          return cb(n + 3);
        }, 0);
      function fn4(n, cb) {
        setTimeout(() => {
          return cb(n + 4);
        }, 0);
      fn1(10, (n) => {
        fn2(n, (n) => {
          fn3(n, (n) => {
            fn4(n, (n) => {
              console.log(n);//20
      });

解决方法

1. Ajax

Ajax作为js中早期的发送异步请求的方式,翻译过来就是异步的JS和XML的意思,目前用的较少

document.querySelector("button").addEventListener("click", function () {
        //1. 创建核⼼对象
        var xhr = new XMLHttpRequest();
        //2.通过核⼼对象⽅法给当前的对象提供访问⽅式和URL路径
        xhr.open("get", "https://api.q6q.cc/blog");
        //3.发送当前的请求⾄指定的URL
        xhr.send();
        //4.异步回调接收返回值并处理
        xhr.onreadystatechange = function () {
          //xhr.readyState==4代表XMLHttpRequest对象读取服务器的响应结束
          //xhr.status==200响应成功
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.response);
            console.log(JSON.parse(xhr.response));
        console.log("我是一个波浪线~~~~~~~");
      });

拿到返回结果,并且不影响其他代码的正常运行

补充: readyState有五种可能的值:

  • 0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法。
  • 1 (载入):已经调用open()方法,但尚未发送请求。
  • 2 (载入完成): 请求已经发送完成。
  • 3 (交互):可以接收到部分响应数据。
  • 4 (完成):已经接收到了全部数据,并且连接已经关闭。

2. Promise

为了解决一部带来的问题,js推出新对象promise,专门用来存储异步代码对象,他可以确保异步代码的执行和返回结果

Promise的回调函数可以指定两个参数 resolve :在代码正常执行时,来设置返回值的 reject(可选) :在代码执行出错时,用来设置错误信息,反正我不用,用catch更优雅

当Promise中的代码正常执行时,会通过then方法回调来返回结果,直接抛出异常非正常执行则不会执行then

const myPromise = new Promise((resolve, reject) => {
        // throw new Error("报错了");
        setTimeout(() => {
          console.log("异步函数");
          //设置返回值
          resolve("hello");
        }, 1000);
      //   获取myPromise中的返回值
      myPromise
        .then((result) => console.log(result))
        .catch((e) => console.log(e));

这时解决上述回调地狱问题就可以直接链式调用

      function fn1(n) {
        return new Promise((resolve) => {
          resolve(n + 1);
      function fn2(n) {
        return new Promise((resolve) => {
          resolve(n + 2);
      function fn3(n) {
        return new Promise((resolve) => {
          resolve(n + 3);
      function fn4(n) {
        return new Promise((resolve) => {
          resolve(n + 4);
      fn1(10)
        .then((n) => fn2(n))
        .then((n) => fn3(n))
        .then((n) => fn4(n))
        .then((n) => console.log(n))//20
        .catch((e) => console.log(e));

3. Fetch

fetch是官方的发送异步请求的工具,基于promise,相较于ajax更加方便

document.querySelector("button").addEventListener("click", function () {
        fetch("https://api.q6q.cc/blog")
          .then((resp) => resp.json())
          .then((data) => console.log(data));
      });

4. Axios

非官方的发送异步请求的库,基于promise,需要自己引入,可以更好地封装,使用范围广,更方便

document.querySelector("button").addEventListener("click", function () {
        axios
 
推荐文章
果断的汤圆  ·  promise多并发请求方法_js promise.allsettled并发请求
4 周前
精明的蜡烛  ·  SQL错误: 241,SQLState: 22007-腾讯云开发者社区-腾讯云
1 年前
风流的匕首  ·  Linux常用命令-解压缩篇 - 知乎
2 年前
茫然的海豚  ·  【tensorrt】——显卡对应的硬件能力与精度_tensorrt 40xianka-CSDN博客
2 年前
狂野的小蝌蚪  ·  深入了解MMU是如何完成地址翻译的?【建议收藏】 - 掘金
2 年前
爱健身的马铃薯  ·  懂算法才能打“算法战” - 中华人民共和国国防部
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号