Promise – 基本使用
简介
Promise是一个用于Javascript或 Typescript 语言上的异步操作函数。
回调地狱
多层回调函数的相互嵌套,称为回调地狱。
回调地狱的缺点:
代码耦合性太强,牵一发而动全身,难以维护
大量冗余的代码相互嵌套,代码的可读性变差
基本概念
1.Promise 是一个构造函数
我们可以创建 Promise 的实例 const p = new Promise()
new 出来的 Promise 实例对象,代表一个异步操作
2.Promise.prototype 上包含了一个 .then() 方法
所以每一次 new Promise() 构造函数微到的实例对象
都可以通过原型链的方式访问到 .then() 方法,例如 p.then()
3. .then() 方法用来预先指定成功和失败的回调函数
p.then(成功的回调函数,失败的回调函数)
p.then(result => {}, error => {})
调用.then() 方法时,成功的回调函数是必选的、失败的回调函数是可选的
案例:文件读取
基于回调函数按顺序读取文件
这种嵌套式代码阅读性差,维护性也不好,形成回调地狱。
基于 then-fs 读取文件内容
由于node.js 官方提供的fs 模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式。因此,需 要先运行如下的命令,安装then-fs 这个第三方包,从而支持我们基于 Promise 的方式读取文件的内容
then-fs 的基本使用
调用then-fs 提供的readFile() 方法,可以异步地读取文件的内容,它的返回值是 Promise 的实例对象。因 此可以调用.then() 方法为每个 Promise 异步操作指定成功和失败之后的回调函数。
上述的代码无法保证文件的读取顺序,需要做进一步的改进!
then() 方法的特性
如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理。通过 .then() 方法的链式调用,就解决了回调地狱的问题。
基于 Promise 按顺序读取文件的内容
Promise 支持链式调用,从而来解决回调地狱的问题。
通过 .catch 捕获错误
在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理
如果不希望前面的错误导致后续的 .then 无法正常执行,则可以将 .catch 的调用提前
Promise.all() 方法
Promise.all() 方法会发起并行的 Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的 .then 操作(等待机制)。
数组中 Promise 实例的顺序, 就是最终结果的顺序!
Promise.race() 方法
Promise.race() 方法会发起并行的 Promise 异步操作,只要任何一个异步操作完成,就立即执行下一步的 .then 操作(赛跑机制)。
基于 Promise 封装读文件的方法
如果想要创建具体的异步操作,则需要在new Promise() 构造函数期间,传递一个function 函数,将具体的 异步操作定义到function 函数内部。
通过.then() 指定的成功和失败的回调函数,可以在function 的形参中进行接收
Promise 异步操作的结果,可以调用resolve 或 reject 回调函数进行处理。
共有 0 条评论