同步代码和异步代码、回调地狱、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++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav