如何理解promise 续二

尝试自定义promise搭建

Promise.resolve 封装

先来看一下,本身Promise 中的resolve 方法的写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>

	</body>
	<script type="text/javascript">
		let p =Promise.resolve()
		console.log(p)
	</script>
</html>

在这里插入图片描述
那么在自定义的promise.js 中要怎么写?

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../js/promise.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>

	</body>
	<script type="text/javascript">
		let p =Promise.resolve(new Promise((resolve,reject)=>{
			reject('111')
		}))
		console.log(p)
	</script>
</html>
//添加resolve 方法
Promise.resolve =function(value){
	return new Promise((resolve,reject)=>{
		if(value instanceof Promise){
			value.then(v=>{
				resolve(v)
			},r=>{
				reject(r)
			})
		}else{
			resolve(value)
		}
	})
}

Promise.reject 封装


//添加resolve 方法
Promise.reject =function(value){
	try {
		return new Promise((resolve,reject)=>{
			reject(value)
		})
	} catch (error) {
		//TODO handle the exception
		reject(error)
	}
	
}

Promise.all 封装

先来看一下,本身Promise 中的all 方法的写法

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<!-- <script src="../js/promise.js" type="text/javascript" charset="utf-8"></script> -->
	</head>
	<body>

	</body>
	<script type="text/javascript">
		let p1= new Promise((resolve,reject)=>{
			resolve('11')
		});
		let p2= Promise.resolve(233);
		let p3= Promise.resolve(23);
		
		let result = Promise.all([p1,p2,p3])
		
		console.log(result)
	</script>
</html>

在这里插入图片描述
自定义的方法

Promise.all =function(promises){
	return new Promise((resolve,reject)=>{
		//声明变量,来计算成功的数量
		let count =0;
		//成功结果的数组
		let arr=[];
		for (let index =0; index < promises.length; index++) {
			var promise = promises[index];
			promise.then(v=>{
				count++;
				//将当前promise对象成功的结果存储到数组中
				arr[index]=v;
				if(count === promises.length){
					resolve(arr)
				}
			},r=>{
				reject(r)
			})
		}
		
		
	})
	
}

Promise.race 封装

Promise.race = function(promises){
	return new Promise((resolve,reject)=>{
		for (let i = 0; i < promises.length; i++) {
			 promises[i].then(v=>{
				 resolve(v)
			 },r=>{
				 reject(r)
			 })
			
		}
	})
	
}

封装成class

class Promise {
	//构造方法
	constructor(exectuor) {
		
	}


	then(onResolved, onRejected) {
		
	}

	catch(onRejected){
		
	}
	
	static resolve(value){
		
	}
	
	static reject(value) {
		
	}
	
	static all (promises) {
		
	}
	
	
	static race (promises) {
	
	}
}

async 与await

async 函数

  • 函数都返回值为promise对象
  • promise对象的结果由async函数执行的返回值决定
    如果返回值是一个非Promise类型的数据,则Promise的状态是fulfilled
    如果返回值是一个Promise的对象,则返回状态由这个Promise的状态决定
    如果throw 异常,则返回状态就是rejected
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		async function test(){
			
		}
		let result =test();
		console.log(result)
	</script>
</html>

在这里插入图片描述

await表达式

  • await右侧的表达式一般为promise对象,但也可以是其他的值
  • 如果表达式是promise对象,await返回的是promise成功的值
  • 如果表达式是其他值,直接将此值作为await的返回值

注:
await 必须写在async函数中,但async函数中可以没有await
如果await的promise失败了,就会抛出异常,需要通过try…catch捕获异常

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		async function test(){
			let p =new Promise((resolve,reject)=>{
				resolve('ok')
			})
			let res = await p;
			
			console.log(res)
		}
		test();
	</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

layman0528

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值