同步代码和异步代码、回调地狱、Promise链式调用、async和awat、事件循环EventLoop、宏任务和微任务、Promise.all静态方法

本文主要是介绍同步代码和异步代码、回调地狱、Promise链式调用、async和awat、事件循环EventLoop、宏任务和微任务、Promise.all静态方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

同步代码和异步代码

在这里插入图片描述

异步代码举例

定时器、事件、AJAX、回调函数

回调地狱

回调函数是一个异步的任务,回调函数嵌套回调函数就组成了回调地狱
可读性差、异常捕获困难、耦合性严重
举例:一旦省份报错,后面的就无法获取

<!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>回调地狱</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>/*** 目标:演示回调函数地狱* 需求:获取默认第一个省,第一个市,第一个地区并展示在下拉菜单中* 概念:在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱* 缺点:可读性差,异常无法获取,耦合性严重,牵一发动全身*/axios({url: 'http://hmajax.itheima.net/api/province',method: 'GET'}).then(res => {const pname = res.data.list[0]document.querySelector('.province').innerHTML = pname// 根据省获取城市axios({url: 'http://hmajax.itheima.net/api/city',method: 'GET',params: { pname }}).then(res => {const cname = res.data.list[0]document.querySelector('.city').innerHTML = cname// 根据省份和城市获取地区axios({url: 'http://hmajax.itheima.net/api/area',method: 'GET',params: { pname, cname }}).then(res => {document.querySelector('.area').innerHTML = res.data.list[0]})})})</script>
</body></html>

Promise链式调用(可以解决回调函数嵌套问题)

在这里插入图片描述

  <script>/*** 目标:掌握Promise的链式调用*///  依靠 then的回调函数中, 返回一个 Promise对象 就可以在 then后面继续.then 了const p = new Promise((resolve, reject) => {resolve('成功1')})p.then(res => {console.log(res)return new Promise((resolve, reject) => {resolve(res + '  成功2')})}).then(res => {console.log(res)return new Promise((resolve, reject) => {resolve(res + '  成功3')})}).then(res => {console.log(res)})</script>

在这里插入图片描述

解决回调地狱

1.使用then方法返回新Promise对象特性,一直串联下去,称为Promise的链式调用
2.then回调函数中,return值会传给then方法生成的新Promise对象
3.Promise链式调用解决回调函数嵌套问题

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

async和await的使用(也可以解决回调地狱,比promise更简便)

代替promise、then方法
在async修饰的函数内,使用await关键字取代then函数,等待获取Promise对象成功状态的结果值
await会阻止异步函数内代码继续执行,原地等待结果
在这里插入图片描述

async和await只能处理成功的回调

async和await函数捕获错误i
使用:try…catch 语句标记要尝试的语句块,并指定一个出现异常时抛出的响应

try{
//要执行的代码
}catch(err){
//err接收的是,错误信息
//try里代码,如有错误信息,直接进入这里执行
console.log(err)
}

事件循环

    console.log('', 1);setTimeout(() => {console.log('', 2);}, 0)console.log('', 3);

js是单线程,间歇函数是个异步任务,它会等所有的同步任务执行完之后在执行
在这里插入图片描述
在这里插入图片描述

宏任务和微任务

在这里插入图片描述

Promise.all()

等待机制:会等待所有的Promise对象的成功结果返回才会执行then方法
一但有一个Promise对象失败了,都会执行错误结果
在这里插入图片描述

<script>const arr = []arr.push(axios({url: 'http://hmajax.itheima.net/api/weather',method: 'GET',params: {city: '110100'}}),axios({url: 'http://hmajax.itheima.net/api/weather',method: 'GET',params: {city: '310100'}}),axios({url: 'http://hmajax.itheima.net/api/weather',method: 'GET',params: {city: '210100'}}))console.log('arr:', arr);const p = Promise.all(arr)p.then(res => {console.log('res:', res);document.querySelector('ul').innerHTML = res.map(item => {return `<li>${item.data.data.area}</li>`})}).catch(err => {console.log('err:', err);})</script>

在这里插入图片描述

这篇关于同步代码和异步代码、回调地狱、Promise链式调用、async和awat、事件循环EventLoop、宏任务和微任务、Promise.all静态方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830803

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案