前端框架前置学习(4) AJAX

同步代码和异步代码

同步代码

浏览器按照我们书写代码的顺序一行一行地执行程序.浏览器会等待代码的解析和工作,在上一行代码完成之后才会执行下一行代码.这被称之为同步程序

逐行执行,需要原地等待结果

异步代码

异步编码技术使得程序可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成.与此同时也将在任务完成后显示结果

调用后耗时,不阻塞代码继续执行(不必原地等待),在将要完成后触发一个回调函数

回调函数地狱

概念:在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱

缺点:可读性差,异常无法捕获,耦合性严重,牵一发动全身

 /**
     * 目标:演示回调函数地狱
     * 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中
     * 概念:在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱
     * 缺点:可读性差,异常无法获取,耦合性严重,牵一发动全身
    */
    // 1. 获取默认第一个省份的名字
    axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {
      const pname = result.data.list[0]
      document.querySelector('.province').innerHTML = pname
      // 2. 获取默认第一个城市的名字
      axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }}).then(result => {
        const cname = result.data.list[0]
        document.querySelector('.city').innerHTML = cname
        // 3. 获取默认第一个地区的名字
        axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }}).then(result => {
          console.log(result)
          const areaName = result.data.list[0]
          document.querySelector('.area').innerHTML = areaName
        })
      })
    }).catch(error => {
      console.dir(error)
    })

Promise-链式调用

概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,直到结束

细节:then()回调函数的返回值,会影响新生成的Promise对象最终状态和结果

好处:通过链式调用,解决回调函数嵌套问题

例子:

/**
     * 目标:把回调函数嵌套代码,改成Promise链式调用结构
     * 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中
    */
    let pname = ''
    // 1. 得到-获取省份Promise对象
    axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {
      
      pname = result.data.list[0]
      console.log(pname)
      document.querySelector('.province').innerHTML = pname
      // 2. 得到-获取城市Promise对象
      return axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }})
    }).then(result => {
      const cname = result.data.list[0]
      document.querySelector('.city').innerHTML = cname
      // 3. 得到-获取地区Promise对象
      return axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }})
    }).then(result => {
      console.log(result)
      const areaName = result.data.list[0]
      document.querySelector('.area').innerHTML = areaName
    })

async函数和await

定义

async函数是使用async关键字声明的函数.async函数是AsyncFunction构造函数的实例,并且其中允许使用await关键字.async和await关键字让我们可以使用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地调用Promise

概念

在async函数内,使用await关键字取代then函数,等待获取Promise对象成功状态的结果值

示例

 /**
     * 目标:掌握async和await语法,解决回调函数地狱
     * 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值
     * 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
    */
    // 1. 定义async修饰函数
    async function getData() {
      // 2. await等待Promise对象成功的结果
      const pObj = await axios({url: 'http://hmajax.itheima.net/api/province'})
      const pname = pObj.data.list[0]
      const cObj = await axios({url: 'http://hmajax.itheima.net/api/city', params: { pname }})
      const cname = cObj.data.list[0]
      const aObj = await axios({url: 'http://hmajax.itheima.net/api/area', params: { pname, cname }})
      const areaName = aObj.data.list[0]


      document.querySelector('.province').innerHTML = pname
      document.querySelector('.city').innerHTML = cname
      document.querySelector('.area').innerHTML = areaName
    }

async函数和await捕获错误

使用

try....catch语句标记要尝试的语句块,并指定一个出现异常时抛出的响应

语法

try {
    // 要执行的代码
} catch (error) {
    //  error接收的是,错误信息
    //  try里代码,如果有错误,直接执行这里
}

事件循环

好处

掌握js是如何安排和运行代码的

原因

js单线程(某一时刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了时间循环模型.

概念

js有一个基于事件循环的并发模型,事件循环负责执行代码,收集和处理事件以及执行队列中的子任务.这个模型与其它语言中的模型截然不同.

定义

在执行代码和手机异步任务的模型,在调用栈空闲,反复调用任务队列里回调函数的执行机制,就叫事件循环

宏任务和微任务

ES6之后引入Promise对象,让js引擎也可以发起异步任务

宏任务是由浏览器环境执行的异步代码,微任务是由js引擎环境执行的异步代码

Promise本身是同步的,而then和catch回调函数是异步的

微任务代码执行在同步代码之后,宏任务代码之前(离js引擎更近)

简单的测试题

Promise.all静态方法

语法:

const p = Promise.all([Promise对象,Promise对象])

 p.then(result => {

      // 注意:结果数组顺序和合并时顺序是一致

    }).catch(error => {

        // 第一个失败的Promise对象,抛出异常

    })

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux shell编程学习笔记38:history命令

目录 0 前言 1 history命令的功能、格式和退出状态1.1 history命令的功能1.2 history命令的格式1.3退出状态2 命令应用实例2.1 history:显示命令历史列表2.2 history -a:将当前会话的命令行历史追加到历史文件~/.bash_history中2.3 history -c&#xf…

引领企业人工智慧转型的 5 个可行策略

人工智能的最新进展引发了企业AI转型,其规模、速度和不确定性程度都是巨大的。那些敢于大胆行动、走在时代前沿的企业,将能够抓住人工智能在几乎每个行业中带来的巨大增长和价值创造机会。这样做需要他们的领导人掌握人工智能作为二十一世纪通用技术的深…

hbuilder对比两个文件的方法(图文教程)

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 类似于git上文件不同的版本的对比,hbuilder…

一文轻松入门Dubbo

1、简介 Dubbo是一个高性能、轻量级的开源分布式服务框架,最初由阿里巴巴开发并开源。它提供了服务注册、发现、调用和负载均衡等分布式服务治理功能,旨在简化分布式系统的开发和维护。 Dubbo框架的核心概念: 服务提供者(Provider)&#xf…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C) Baumer工业相机Baumer工业相机的图像剪切(ROI)功能的技术背景CameraExplorer如何使用图像剪切(ROI)功…

【网络安全 | Misc】normal_png

方法一 可以通过stegsolve或winhex看到图片高度被改写: 改为: 再保存图片即可: flag{B8B68DD7007B1E406F3DF624440D31E0}方法二 使用脚本查看宽高是否被修改: import zlib import struct import argparse import itertoolspars…

【开源】基于Vue+SpringBoot的学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

Java集合/泛型篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、什么是list接口二、说说ArrayList(数组)三、Vector( 数组实现、 线程同步)四、说说LinkList(链表)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展,数据规模指数级膨胀,对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板,只能适应有限的场景: >> 新型分布式…

双指针刷题(三)

所有算法文章链接(最底部) http://t.csdnimg.cn/IbllR 1.有效三角形个数 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 1.分析题意 给一个非负的数组,判断这个数组能组成多少个三角形。 2.解题思路 补充知识…

Python:正则表达式速通,码上上手!

1前言 正则表达式(Regular Expression)是一种用来描述字符串模式的表达式。它是一种强大的文本匹配工具,可以用来搜索、替换和提取符合特定模式的文本。 正则表达式由普通字符(例如字母、数字、符号等)和元字符&#…

NFS的基本使用

#江南的江 #每日鸡汤:岁月匆匆,时光荏苒,感悟人生路漫漫,不忘初心方得始终。 #初心和目标:和从前的自己博弈。 NFS(存储共享服务) 本文要点摘要: 下面将讨论什么是NFS,如何配置NFS,…

自然语言处理(第17课 文本分类和聚类)

一、学习目标 1.学习文本分类的两种传统机器学习方法:朴素贝叶斯和支持向量机 2.学习文本分类的深度学习方法 3.学习文本分类的性能评估标准 4.学习文本聚类的相似性度量、具体算法、性能评估 二、文本分类 1.概述 将文本分类,主要工作是让机器分析文…

迅为RK3588开发板RTMP推流之视频监控之搭建 RTMP 媒流体服务器

1.安装 nginxrtmp 运行所要用到的库和依赖环境 apt-get update apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev openssl 2. 下 载 nginx-1.20.2 源 码 ( 下 载 地 址 : http://nginx.org/download/nginx-1.20.2.tar.gz) 和nginx-…

【力扣题解】P226-翻转二叉树-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P226-翻转二叉树-Java题解🌏题目描述💡题解🌏总结…

MySQL高级SQL语句补充

目录 1.空值(NULL)和 无值( )的区别 2.正则表达式 3.存储过程 存储过程的优点 创建存储过程 调用存储过程 查看存储过程 存储过程的参数 IN 输入参数 OUT 输出参数 INOUT 输入输出参数 删除存储过程 存储过程的控制语…

QT中的信号与槽的讲解

文章目录 信号及其特点槽及其特点代码演示标准信号与标准槽函数方式一方式二 自定义信号和槽connect()函数信号和槽函数存在函数重载的情况下Qt的信号槽机制注意事项 信号及其特点 信号:是一种特殊的函数,又称信号函数,俗称信号,…

vue 项目 添加 页面上方 NProgress进度条

NProgress官网和Github地址 路由 跳转时 页面上方 和 右上角 会有一个加载进度 安装 使用npm安装 npm install --save nprogress 基本用法 main.js 引入 import NProgress from “nprogress”; import “nprogress/nprogress.css”; 开关和关闭 start()开启NProgress进度条d…

李宏毅 自然语言处理(Voice Conversion) 笔记

前一章笔记:李宏毅 自然语言处理(Speech Recognition) 笔记 引入 什么是voice conversion? 输入一段声音,输出另一段声音,我们希望这两端声音:内容一样,其他方面不一样&#xff08…

移动硬盘打不开怎么办?没有比这更好的办法了

移动硬盘打不开是常见故障,可能的原因有很多,例如硬盘驱动器故障、文件系统损坏、分区表错误等。本文将详细分析这些原因,并提供相应的解决方法,帮助您解决移动硬盘打不开的问题。 当移动硬盘打不开时,为了保留其中的文…
最新文章