同步代码和异步代码、回调地狱、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

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)