JavaScript进阶教程——异步编程、封装Ajax

news2024/9/23 19:27:46

异步编程

什么是同步与异步:
同步:一件事没做完,只能等待,完成之后再去做另一件事
异步: 两件事可以同时进行

前端开发中最常见的两种异步情况:

  1. ajax: 向后台请求数据
  2. 计时器: setInterval setTimeout

比如:我想喝奶茶和吃火锅,两者都点了外卖,两个外卖制作互不影响,但是我想先喝奶茶,再吃火锅,这个顺序不能乱 但是奶茶店比较忙,火锅先到了,这个逻辑没有按照我的预期执行,这个时候就出现bug,应该如何处理?

在这里插入图片描述

如何获取到异步数据?

回调函数:将函数作为参数传递给另一个函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何摆脱回调地狱

Promise

let tea = new Promise((resolve, reject)=> {
  setTimeout(() => {
    let flag = true;
    if(flag) {
      resolve("奶茶")
    }else {
      reject("获取奶茶失败")
    }
  }, 2000)
})

let hotpot = new Promise((resolve, reject)=> {
  setTimeout(() => {
    let flag = true;
    if(flag) {
      resolve("火锅")
    }else {
      reject("获取火锅失败")
    }
  }, 2000)
})


tea.then((data) => {
  console.log(data)
  return hotpot;
}).then((data) => {
  console.log(data)
}).catch(err => {
  console.log('err', err)
})

在这里插入图片描述

如何让异步程序更容易维护?

async函数(await)

let tea = new Promise((resolve, reject)=> {
  setTimeout(() => {
    let flag = true;
    if(flag) {
      resolve("奶茶")
    }else {
      reject("获取奶茶失败")
    }
  }, 2000)
})

let hotpot = new Promise((resolve, reject)=> {
  setTimeout(() => {
    let flag = true;
    if(flag) {
      resolve("火锅")
    }else {
      reject("获取火锅失败")
    }
  }, 2000)
})

async function fun() {
  let dataTea = await tea
  console.log(dataTea)
  let dataHotPot = await hotpot
  console.log(dataHotPot)
}
fun()

在这里插入图片描述

封装ajax

axios获取异步数据:
在实际项目开发的过程中,我们通常是使用第三方ajax库来实现数据交互的,例如jQuery的ajax方法,或者是axios。

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

封装ajax

我们使用XMLHttpRequest对象,封装一个自定义的axios方法

0: 请求未初始化,还没有调用open()
1: 请求已经建立,但是还没有发送,还没有调用send()
2: 请求已发送,正在处理中(通常现在可以从响应中获取内容头)
3: 请求在处理中,通常响应中已有部分数据可用了,没有全局完成
4: 响应已完成,可以获取并使用服务器的响应了。

在这里插入图片描述

   let xhr = new XMLHttpRequest()
    xhr.onreadystatechange = function () {
      console.log(xhr.readyState, "状态变化")
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          console.log(xhr.responseText, '数据')
        } else {
          console.log("获取数据失败")
        }
      }
    }
    xhr.open("get", "/data/tea.txt")

    xhr.send()
 function axios(method, url) {
      return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.onreadystatechange = function () {
          // console.log(xhr.readyState, "状态变化")
          if (xhr.readyState === 4) {
            if (xhr.status === 200) {
              resolve(xhr.responseText, '数据')
            } else {
              reject("获取数据失败")
            }
          }
        }
        // xhr.open("get", "/data/tea.txt")
        xhr.open(method, url)

        xhr.send()
      })
    }

    // axios("get", "/data/tea.txt").then((res) => {
    //   console.log(res)
    //   return axios("get", "/data/hotPot.txt")
    // }).then(res => {
    //   console.log(res)
    // })

    async function getData() {
      let tea = await axios("get", "/data/tea.txt")
      console.log(tea)
      let hotPot = await axios("get", "/data/hotPot.txt")
      console.log(hotPot)
    }

    getData()

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

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

相关文章

Python学习基础笔记四十一——sys模块

sys模块是与Python解释器交互的一个接口。 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) sys.version 获取Python解释程序的版本信息 sys.path 返…

ARM Cortex M3处理器概述

Cortex-M3概述 2004年ARM发布作为新型Corex处理器内核系列首款的Cortex-M3处理器。 STM32系列基于专为高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核。 STM32命名规则 STMF103xx系统结构 1.使用高性能的ARM Cortex-M3 32位RISC内核 2.工作频率为72MHZ 3.内…

shell脚本监控文件夹文件实现自动上传数据到hive表

sh createtb.sh “tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2” 数据库名:observation (脚本里写死了) 表名:tablename 指定名:field1,field2,field3,field4,field5,field6,f…

分别使用Alpine、Docker制作jdk镜像

目录 制作 jdk 1.0 镜像 ——Docker 1.创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件 2.编写 Dockerfile 文件 3.执行Dockerfile文件,初次依赖镜像的时候会下载相应镜像 优化制作jdk镜像(缩小内存大小)——使用alpine …

【致敬世界杯】球迷(我)和足球的故事

目录 一、第一次接触足球 二、回味无穷的2018世界杯 三、致敬世界杯 3.1 源代码 3.2 思路 3.3 关于图片 一、第一次接触足球 踢足球是一项优秀的运动,它可以锻炼身体,增强团队合作精神,并为人们带来快乐和满足感。回忆起小学时候第一次…

OpenCV和RTSP的综合研究

一、RTSP是什么?用来干什么? RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IET…

四旋翼无人机学习第14节--PCB Editor简单绘制封装-1

文章目录1 前言1.1 网络获取1.2 封装软件生成1.3 立创商城封装转化1 前言 在之前的博客中,我们绘制了封装所需的焊盘,有了焊盘我们就可以绘制封装啦。当然封装的获取有很多途径,下面我来总结一下。 1.1 网络获取 (有需要的可以下载哦&…

华为eNSP模拟器配置MSTP多实例生成树

传统的stp、rstp有其必然的缺陷 1.统一局域网内所有的vlan共享一个生成树,无法在vlan间实现数据流量的负载均衡。 2.链路利用率低,被阻塞的冗余链路不承载任何流量,造成了带宽的浪费,还可能造成部分vlan报文无法转发。MSTP在它们…

计算机毕业设计springboot+vue基本微信小程序的学习资料共享小程序

项目介绍 前台为用户使用的,包括下面一些功能: ① 资料发布:用户可以将想要共享的资料发布到小程序,供他人购买。 ②搜索 :分为按名称搜索和分类搜索,用户可选择其中一种方式,检索自己所需要的资料。 ③ 查看资料详情:用户可以…

学委必备小工具——筛选未提交人数【python小工具】

问题描述 作为一个学委,通常的任务就是收取班级作业,然后向老师报告当前未交人员的名单 JS版本:实现以一个表格数据查询另一个表格【JS】 之前我已经尝试通过用JS实现了,本质上差别其实也不是很大,只是对于JS来说&…

Java基础之《netty(11)—netty模型》

一、简单说明 1、工作原理示意图 netty主要基于主从Reactors多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor。 2、说明 (1)BossGroup线程维护selector,只关注Accept事件。 (2)当接收到…

[附源码]Node.js计算机毕业设计出版社样书申请管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 我们将属性称为特征,对当前学习任务有用的属性称为相关特征、没什么用的属性称为无关特征。还有一类特征称为冗余特征,它们所包含的信息能从其他特征中推演出来,冗余特征在很多时候不起作用,去除它们会减轻学…

redis之如何应对并发访问问题

写在前面 本文一起看下Redis的并发访问控制。 1:单线程的Redis为什么会有并发问题 我们知道,Redis是单线程的,为什么还是会有并发问题呢?没错,如果是单命令操作的话肯定没有并发问题,但考虑事务的场景&a…

nodejs+vue人事管理系统30n9o

开发语言:nodejs 框架:Express 数据库:mysql 数据库工具:Navicat11 开发软件:VS code 浏览器:谷歌浏览器 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 …

使用VS2019开发调试Android动态库

1. 环境准备 1.1 安装JDK:jdk1.8.0_112 1.2 安装Android SDK SDK可以安装指定的platforms和ndk-bundle。为了兼容性考虑,单独安装了版本比较老的android-ndk-r10b 1.3 安装VS2019 安装VS2019并选择:使用C的移动开发。 1.4 连接开发手机…

基于Java+Mysql实现(web)大型企业管理系统【100010019】

第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作,管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet,JSP&#xff…

spring——Spring自动装配(基于注解)——前提了解——Spring的@Autowired注解为什么用在接口上 (转载)...

大家都知道Service注入的是实现类serviceImpl,那使用时怎么能获取到接口,而且还能调用到实现类的方法。 接口: public interface TestService{ public String test(); }实现类: Service public class TestServiceImpl imp…

Netty_04_消息协议设计与实战(实践类)

文章目录一、前言二、整体运行:先启动服务端,然后启动客户端,发送三条消息三、客户端和服务端3.1 客户端(重要)3.2 服务端(重要)3.3 编码和解码(了解即可)四、尾声一、前言 源码下载:https://www.syjshare.com/res/XEE10LTG 二、…

【Linux修炼】10.进程地址空间

每一个不曾起舞的日子,都是对生命的辜负。 进程地址空间本节目标1. 回顾C/C地址空间1.1 提出问题1.2 见问题产生的现象1.3 解释现象2. 虚拟地址空间2.1 感性理解虚拟地址空间 2.2 如何“画饼”2.3 地址空间的区域划分3. 进程地址空间与内存的关系3.1 虚拟地址和物理…