AJAX进阶(重点)

目录

◆ 同步代码和异步代码

◆ 回调函数地狱和 Promise 链式调用

什么是回调函数地狱?

Promise - 链式调用

什么是Promise链式调用?

Promise 链式应用 (重点)

◆ async 和 await 使用

async函数和await_捕获错误 

◆ 事件循环-EventLoop(重点)

为什么要学习事件循环?

什么是事件循环? 

事件循环 - 执行过程(重点)

事件循环 - 练习 

宏任务与微任务 (重点)

事件循环 - 经典面试题 

◆ Promise.all 静态方法


◆ 同步代码和异步代码

什么是同步代码,什么是异步代码?

同步代码:

异步代码:

 

同步代码:逐行执行,需原地等待结果后,才继续向下执行 

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

例子:回答打印数字的顺序是什么? 

打印结果:1,4,2 点击按钮一次就打印一次 3 

异步代码接收结果:使用回调函数

◆ 回调函数地狱和 Promise 链式调用

什么是回调函数地狱?

需求:展示默认第一个省,第一个城市,第一个地区在下拉菜单中

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

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

 

总结:简单讲。回调函数地狱就是在回调函数中嵌套回调函数,进而导致代码耦合度高,异常难以捕获

Promise - 链式调用

什么是Promise链式调用?

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

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

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

Promise 链式应用 (重点)

目标:使用 Promise 链式调用,解决回调函数地狱问题

做法:每个 Promise 对象中管理一个异步任务,用 then 返回 Promise 对象,串联起来

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Promise链式调用_解决回调地狱</title>
</head>

<body>
  <form>
    <span>省份:</span>
    <select>
      <option class="province"></option>
    </select>
    <span>城市:</span>
    <select>
      <option class="city"></option>
    </select>
    <span>地区:</span>
    <select>
      <option class="area"></option>
    </select>
  </form>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /**
     * 目标:把回调函数嵌套代码,改成Promise链式调用结构
     * 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中
    */
    let pname = ''
    // 1. 得到-获取省份Promise对象
    axios({url: 'http://hmajax.itheima.net/api/province'}).then(result => {
      pname = result.data.list[0]
      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
    })
  </script>
</body>

</html>

 

总结: 

1. 什么是 Promise 的链式调用?

  • ➢ 使用 then 方法返回新 Promise 对象特性,一直串联下去

2. then 回调函数中,return 的值会传给哪里?

  • ➢ 传给 then 方法生成的新 Promise 对象

3. Promise 链式调用有什么用?

  • ➢ 解决回调函数嵌套问题 

◆ async 和 await 使用

定义:

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

示例:

 

 简单来说,当函数使用了async关键字,可以使用await关键字讲函数内的异步函数转化成同步函数

async函数和await_捕获错误 

 

◆ 事件循环-EventLoop(重点)

  • 为什么要学习事件循环?

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

什么是事件循环? 

概念:

原因:JavaScript 单线程(某一刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型 

事件循环 - 执行过程(重点)

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

总结:

1. 什么是事件循环?

  • ➢ 执行代码和收集异步任务,在调用栈空闲时,反复调用任务队列里

回调函数执行机制
2. 为什么有事件循环?

  • ➢ JavaScript 是单线程的,为了不阻塞 JS 引擎,设计执行代码的模型

3. JavaScript 内代码如何执行?

  • ➢ 执行同步代码,遇到异步代码交给宿主浏览器环境执行
  • 异步有了结果后,把回调函数放入任务队列排队
  • ➢ 当调用栈空闲后,反复调用任务队列里的回调函数 

事件循环 - 练习 

使用模型,分析代码执行过程

宏任务与微任务 (重点)

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

异步任务分为:

宏任务:由浏览器环境执行的异步代码

例子:

微任务:由 JS 引擎环境执行的异步代码

例子:

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

使用图解-分析代码执行顺序

 

JS代码的执行流程:script代码块-》代码块里的同步任务-》微任务-》宏任务 

事件循环 - 经典面试题 

答案:1756234 

总结:

1. 什么是宏任务?

  • ➢ 浏览器执行的异步代码
  • ➢ 例如:JS 执行脚本事件,setTimeout/setInterval,AJAX请求完成事件,用户交互事件

2. 什么是微任务?

  • ➢ JS 引擎执行的异步代码
  • ➢ 例如:Promise对象.then()的回调

3. JavaScript 内代码如何执行?

  • ➢ 执行第一个 script 脚本事件宏任务,里面同步代码
  • ➢ 遇到 宏任务/微任务 交给宿主环境,有结果回调函数进入对应队列
  • ➢ 当执行栈空闲时,清空微任务队列,再执行下一个宏任务,从1再来

 

◆ Promise.all 静态方法

概念:合并多个 Promise 对象,等待所有同时成功完成(或某一个失败),做后续逻辑

语法: 

案例:

需求:同时请求“北京”,“上海”,“广州”,“深圳”的天气并在网页尽可能同时显示

 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Promise的all方法</title>
</head>

<body>
  <ul class="my-ul"></ul>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /**
     * 目标:掌握Promise的all方法作用,和使用场景
     * 业务:当我需要同一时间显示多个请求的结果时,就要把多请求合并
     * 例如:默认显示"北京", "上海", "广州", "深圳"的天气在首页查看
     * code:
     * 北京-110100
     * 上海-310100
     * 广州-440100
     * 深圳-440300
    */
    // 1. 请求城市天气,得到Promise对象
    const bjPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '110100' } })
    const shPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '310100' } })
    const gzPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440100' } })
    const szPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440300' } })

    // 2. 使用Promise.all,合并多个Promise对象
    const p = Promise.all([bjPromise, shPromise, gzPromise, szPromise])
    p.then(result => {
      // 注意:结果数组顺序和合并时顺序是一致
      console.log(result)
      const htmlStr = result.map(item => {
        return `<li>${item.data.data.area} --- ${item.data.data.weather}</li>`
      }).join('')
      document.querySelector('.my-ul').innerHTML = htmlStr
    }).catch(error => {
      console.dir(error)
    })
  </script>
</body>

</html>

 

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

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

相关文章

算法设计与分析实验:滑动窗口与二分查找

目录 一、寻找两个正序数组的中位数 1.1 具体思路 1.2 流程展示 1.3 代码实现 1.4 代码复杂度分析 1.5 运行结果 二、X的平方根 2.1 具体思路 2.2 流程展示 2.3 代码实现 2.4 代码复杂度分析 2.5 运行结果 三、两数之和 II-输入有序数组 3.1 采用二分查找的思想 …

ES6详解

一 let 和 const ES6中可以使用let和const声明变量&#xff0c;用法类似于var const声明的为常量&#xff0c;不可修改&#xff08;但声明对象&#xff0c;对象中的属性可以修改&#xff09;&#xff0c;由于这个特性&#xff0c;它需要在声明的同时就赋值&#xff0c;否则报错…

SpringBoot+SqlServer查询接口

SpringBootSqlServer查询接口 文章目录 SpringBootSqlServer查询接口1. pom环境配置2. common工具包3. 实体类接口映射4. Service层Controller层 需求&#xff1a;根据站号查询前一个小时的所有数据&#xff0c;将数据返回格式为Map<String,List<Map<String,String>…

双非本科准备秋招(9.2)——力扣哈希

1、383. 赎金信 跟昨天的题大同小异&#xff0c;因为只有26个字母&#xff0c;所以可以建个有26个坑位的数组。 做完昨天的题目&#xff0c;这个题没啥新意。 class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] hashTable new int[…

语言模型大战:GPT、Bard与文心一言,谁才是王者?

如何对GPT-3.5、GPT-4、Bard、文心一言、通义千问的水平进行排序&#xff1f; 在聊技术原理之前我们来先看看几个产品的团队背景 一、团队背景 1.1、ChatGPT ChatGPT团队的成员大多具有计算机科学、人工智能、自然语言处理、机器学习等相关领域的高等教育背景&#xff0c;有…

十分钟发布自己的NFT

概述 本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约&#xff08;ERC721&#xff09;。本着DRY&#xff08;Dont Repeat Yourself&#xff09;原则&#xff0c;我们需要站在巨人的肩膀上来搭建自己的应用&#xff0c;使用经过社区审计和实践检验的代码可以有效…

【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

零拷贝Zero-Copy 我们先来看下它的定义&#xff1a; “Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when t…

Cubase 13.0下载安装教程,附安装包和工具,轻松解决安装问题

前言 Cubase是一款专业级的高级音乐创作软件&#xff0c;凭借其无与伦比的灵活工具&#xff0c;您可以快速和直观地创造任何类型的音&#xff0c;充满了各种各样的虚拟仪器、效果和数干种声音。 准备工作 1、Win7及以上系统 2、提前准备好 Cubase 13.0 安装包 没有的可以参…

Kafka高级_生产者ACk机制数据一致性问题

Kafka高级_生产者ACk机制&数据一致性问题 目录需求&#xff1a; 设计思路实现思路分析1.Kafka高级_生产者ACk机制2.Kafka高级数据一致性问题 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

基于51单片机天大的滚动显示Protues仿真设计

一、设计背景 数码管是一种常见的数字显示设备&#xff0c;它主要由发光二极管&#xff08;LED&#xff09;和控制电路组成。LED数码管可以分为共阳&#xff08;公共阳极&#xff09;和共阴&#xff08;公共阴极&#xff09;两种类型。在共阳数码管中&#xff0c;每个数码管的阳…

【性能测试】常见适用场景以及策略

面对日益复杂的业务场景和不同的系统架构&#xff0c;前期的需求分析和准备工作&#xff0c;需要耗费很多的时间。而不同的测试策略&#xff0c;也对我们的测试结果是否符合预期目标至关重要。 这篇博客&#xff0c;聊聊我个人对常见的性能测试策略的理解&#xff0c;以及它们…

RabbitMQ中死信交换机的应用,工作原理,实现案例

目录 一、介绍 1. 概述 2. 应用场景 3. 工作原理 二、应用 1. 讲述 2. 运用 三、案例 1. 实践 2. 代码整合 每篇一获 一、介绍 1. 概述 死信交换机是用来处理消息队列中无法被消费者正确处理的消息的交换机。当消息在队列中变成死信时&#xff0c;它会被重新发送…

指针的深入理解(一)

这一节主要复习数组指针&#xff0c;int (* )[ ] 就是数组指针类型的标志。 因为有&#xff08;&#xff09;将*括起来&#xff0c;所以&#xff08;*&#xff09;表示一个指针。[ ] 表示数组&#xff0c;所以&#xff08;*&#xff09;[ ]就表示一个指向数组的指针&#xff…

Day02-课后练习2-参考答案(数据类型和运算符)

文章目录 巩固题1、案例&#xff1a;今天是周2&#xff0c;100天以后是周几&#xff1f;2、案例&#xff1a;求三个整数x,y,z中的最大值3、案例&#xff1a;判断今年是否是闰年4、分析如下代码的计算结果5、分析如下代码的计算结果6、分析如下代码的计算结果7、分析如下代码的计…

STM32以太网接口的配置和使用方法详解

STM32 微控制器提供了多种系列和型号&#xff0c;不同型号的芯片可能有不同的以太网接口&#xff0c;包括MAC&#xff08;媒体访问控制器&#xff09;和PHY&#xff08;物理层接口&#xff09;等组件。在这里&#xff0c;我们以STM32F4系列为例来详细介绍以太网接口的配置和使用…

【精品教程】如何查看iOS崩溃日志

简介 当一个应用程序崩溃&#xff0c;会产生一个崩溃报告&#xff08;crash report&#xff09;&#xff0c;并存储到设备中。崩溃报告描述了应用程序崩溃的条件&#xff0c;通常包含每个执行线程的完整回溯。查看崩溃报告可以帮助我们了解应用程序的崩溃情况&#xff0c;并尝…

大数据学习之Redis、从零基础到入门(三)

目录 三、redis10大数据类型 1.哪十个&#xff1f; 1.1 redis字符串&#xff08;String&#xff09; 1.2 redis列表&#xff08;List&#xff09; 1.3 redis哈希表&#xff08;Hash&#xff09; 1.4 redis集合&#xff08;Set&#xff09; 1.5 redis有序集合&#xff08…

幻兽帕鲁越玩越卡,内存溢出问题如何解决?

近期幻兽帕鲁游戏大火&#xff0c;在联机组队快乐游玩的同时&#xff0c;玩家们也发现了一些小问题。由于游戏有随机掉落材料的设定&#xff0c;服务器在加载掉落物的过程中很容易会出现掉帧、卡顿的情况。某些玩家甚至在游戏1&#xff5e;2时后就出现服务器崩溃的情况&#xf…

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路 low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <script&…

解锁潜在价值:服装定制小程序在提升用户忠诚度上的作用

随着科技的不断进步和消费者日益追求个性化的需求&#xff0c;服装定制已成为时尚界的新宠。而在这个快节奏的时代&#xff0c;小程序作为一个方便、实用的工具&#xff0c;为服装品牌打造个性化定制的平台提供了新的可能性。通过利用小程序&#xff0c;服装品牌可以轻松地与消…