本文主要是介绍同步代码和异步代码、回调地狱、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静态方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!