Promise学习笔记

文章介绍了回调地狱的问题以及如何使用Promise来解决,包括Promise的基本概念、then-fs模块在Node.js中用于Promise方式读取文件的使用,以及如何通过Promise的链式调用和Promise.all()、Promise.race()方法来控制异步操作的顺序和并行执行。
摘要由CSDN通过智能技术生成

1.回调地狱

多层回调函数的相互嵌套,就形成了回调地狱。示例代码如下:
在这里插入图片描述
回调地狱的缺点:

  1. 代码耦合性太强,牵一发而动全身,难以维护
  2. 大量冗余的代码相互嵌套,代码的可读性变差

1.1 Promise 的基本概念

  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()方法时,成功的回调函数是必选的、失败的回调函数是可选的
    在这里插入图片描述

2.基于then-fs 读取文件内容

由于node.js官方提供的fs模块仅支持以回调函数的方式加粗样式读取文件,不支持Promise的调用方式。因此,需要先运行如下的命令,安装then-fs这个第三方包,从而支持我们基于Pfomise的方式读取文件的内容:

npm i then-fs

2.1 then-fs的基本使用

调用then-fs 提供的readFile()方法,可以异步地读取文件的内容,它的返回值是Promise的实例对象。因此可以调用.then()方法为每个Promise 异步操作指定成功失败之后的回调函数。示例代码如下:

import thenFs from 'then-fs'

thenFs.readFile('./files/1.txt', 'utf8').then((r1) => {console.log(r1)})
thenFs.readFile('./files/2.txt', 'utf8').then((r2) => {console.log(r2)})
thenFs.readFile('./files/3.txt', 'utf8').then((r3) => {console.log(r3)})

注意:上述的代码无法保证文件的读取顺序,需要做进一步的改进!

2.2 基于Promise按顺序读取文件的内容

Promise支持链式调用,从而来解决回调地狱的问题。
在Promise 的链式操作中如果发生了错误,可以使用Promise.prototype.catch方法进行捕获和处理:

import thenFs from 'then-fs'

thenFs
  .readFile('./files/11.txt', 'utf8')
  .catch((err) => {
    console.log(err.message)
  })
  .then((r1) => {
    console.log(r1)
    return thenFs.readFile('./files/2.txt', 'utf8')
  })
  .then((r2) => {
    console.log(r2)
    return thenFs.readFile('./files/3.txt', 'utf8')
  })
  .then((r3) => {
    console.log(r3)
  })

2.3 Promise.all()方法

Promise.all()方法会发起并行的Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的.then操作(等待机制)。示例代码如下:
在这里插入图片描述

2.4 Promise.race()方法

Promise.race()方法会发起并行的Promise异步操作,只要任何一个异步操作完成,就立即执行下一步的.then操作(赛跑机制)。示例代码如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值