Promise手写与async/await

1.回调地狱

多层回调函数的相互嵌套,就形成了回调地狱。
回调地狱的缺点:
1.代码耦合性太强,牵一发而动全身,难以维护
2.大量冗余的代码相互嵌套,代码的可读性变差
如何解决回调地狱的问题:为了解决回调地狱的问题,ES6(ECMAScript 2015)中新增了 Promise 的概念。

2.Promise 的基本概念

在这里插入图片描述
.then() 方法的特性
如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个 .then() 继续进行处理。通过 .then() 方法的链式调用,就解决了回调地狱的问题。

通过 .catch 捕获错误
在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理:

3.Promise.all() Promise.race()

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

import thenFs from 'then-fs'
// 1.定义一个数组,存放3个读取文件的异步操作
const promiseArr = [
  thenFs.readFile('./files/3.txt', 'utf8'),
  thenFs.readFile('./files/2.txt', 'utf8'),
  thenFs.readFile('./files/1.txt', 'utf8'),
]
// 2.将promise的数组,作为Promise.all()的参数
Promise.all(promiseArr).then(([r1, r2, r3]) => {  //2.1所有的文件读取成功(等待机制)
  console.log(r1, r2, r3)
})

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

Promise.race(promiseArr).then(result => {
  console.log(result)
})

4.谈谈你对promise的理解(面试高频)

1.Promise是一个构造函数,我们可以通过改构造函数来生成Promise的实例;
2.Promise即承诺,后续必要兑现,一旦兑现,不可更改!其状态有三:pending(等待)、resolved(成功)、rejected(失败)
3.Promise是对回调函数的一种封装,是对异步编程的一种改进()
4.Promise的实例可以看做是一个状态展示器,我们可以将拥有状态以及改变状态的业务通过Promise来实现,然后结构async 进一步提成程序的可读性及易维护性
5.

5.手写promise(面试高频)

简易版:

function myPromise(exector) {
			let self = this;
			//status表示一种状态
			let status = "pending";
			let value = undefined;
			let reason = undefined;
			//成功执行
			function resolve(value) {
				if (status == 'pending') {
					self.value = value;
					self.status = "resolve";
				}
			}
			//执行失败
			function reject(reason) {
				if (status == 'pending') {
					self.reason = reason;
					self.status = "reject"
				}
			}
			//对异常操作
			try {
				exector(resolve, reject)
			} catch (e) {
				reject(e)
			}
			//设置promise的then方法
			myPromise.prototype.then = function (resolve,reject) {
				let self = this;
				if (this.status == 'resolve') {
					resolve(self.value)
				}
				if (this.status == 'reject') {
					reject(self.reason)
				}
			}
		}
		//new 一个promise  进行测试  
		let promise = new myPromise((resolve,reject) => {
			resolve("return resolve");
		});
		promise.then(data => {
			console.log(`success${data}`);

		}, err => {
			console.log(`err${err}`);

		})

4.什么是 async/await

async/await 是 ES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在 async/await 出现之前,开发者只能通过链式 .then() 的方式处理 Promise 异步操作。

① 如果在 function 中使用了 await,则 function 必须被 async 修饰
② 在 async 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行

参考:
https://blog.csdn.net/weixin_44972008/article/details/113779708
https://blog.csdn.net/qq_42033567/article/details/108129645

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值