回调地狱
多层回调函数的相互嵌套,形成了回调地狱
缺点
- 代码耦合性太强,牵一发而动全身,难以维护
- 大量冗余的代码相互嵌套,代码的可读性变差
如何解决回调地狱
为了拒绝回调地狱的问题,ES6中新增了Promise
promise的基本概念
①promise是一个构造函数
- 我们可以创建Promise的实例
let p=new Promise()
- new 出来的Promise实例对象,代表一个异步操作
②Promise.prototype上包含了一个.then()
方法
- 每一次 new Promise() 构造函数得到的实例对象,都可以
通过原型链的方式
访问到 .then() 方法,比如:p.then()
③.then() 方法用来预先指定成功和失败的回调函数
- p.then(成功的函数,失败的函数)
- p.then(resolve=>{}.err=>{})
- 调用 .then() 方法是必选的,失败的回调函数是可选的
基于then-fs异步的读取文件内容
①安装then-fs模块
npm i then-fs
then-fs的基本使用
调用 then-fs 提供的 readFile() 方法,可以异步的读取文件的内容,它的返回值是 Promise 的实例对象,因此可以调用 .then() 方法为每一个 promise 异步操作指定成功和失败的回调函数,但是,无法保证文件的读取顺序
.then() 方法的特性
如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理,通过 .then() 方法的链式调用,解决了回调地狱问题
.catch 捕获错误
在 Promise 的链式操作中如果发生了错误,可以使用 promise.prototype.catch 方法进行捕获和处理
如果不希望前面的错误导致后续的 .then() 无法正常执行,则可以将 .catch() 方法的调用提前
Promise.all() 方法
Promise.all() 方法会发起并行的 Promise 异步操作,登所有的异步操作全部结束后才会执行下一步的操作(等待机制)
Promise.race() 方法
Promise.race() 方法会发起并行的 promise 异步操作,只要有一个异步操作完成,就会执行下一步 .then() 操作 (赛跑机制)
基于Promise封装异步读取文件
async/await
使用 async/await 简化 Promise 异步操作
注意事项
①如果在 function 中使用了 await,则 function 必须被 await 修饰
②在 async() 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行