50.vue的Promise

目录

一、什么是Promise

二、promise三种状态

三、promise链式调用

四、Promise的all的使用


一、什么是Promise

Promise是异步编程的一种解决方案。(老Java们狂喜)

可是ajax也可以异步啊,为什么要学promise?

promise可以以链式编程的思想很优雅的解决这个问题。他其实是封装异步的操作。将网络请求的代码和处理逻辑进行分离(then里面就是处理逻辑的部分,前面是网络请求的部分)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	
	<script>
		//1.第一个参数是函数(resolve,reject),可以类比setTimeout
		//2.resolve,reject又分别都是函数
		new Promise((resolve,reject)=>{
			setTimeout(()=>{
				//调用成功运行resolve
				resolve('徐鹏')
				
				//调用失败运行reject
				reject('xxx')
			},1000)
		}).then((data)=>{//成功对应的逻辑处理
			console.log(data)
		}).catch((err)=>{//失败对应的逻辑
			console.log(err)
		})
		
	</script>
</html>

二、promise三种状态

promise封装异步操作之后会有三种状态:

  1. pending:等待状态。比如正在进行网络请求,或者定时器没有到时间
  2. fulfill:满足状态。当我们主动回调了resolve时,就处于该状态,并且会回调.then()
  3. reject:拒绝状态。当我们主动回调了reject时,就处于该状态,并且会回调.catch()

三、promise链式调用

调用里面会嵌套调用,这样套娃的就容易很乱,我们需要链式调用处理。

1.方式一

一个请求,内部包含另一个请求的完整过程

<script>
		new Promise((resolve,reject)=>{
			//第一次网络请求
			setTimeout(()=>{
				resolve()
			},1000)
		}).then(()=>{
			//第一次拿到结果的处理代码
			console.log('111')
			return new Promise((resolve,reject)=>{
				//第二次网络请求
				setTimeout(()=>{
					resolve()
				},1000)
			}).then(()=>{
				//第二次拿到结果的处理代码
				console.log('222')
			})
		})
		
	</script>

2.方式二

<script>
		new Promise((resolve,reject)=>{
			setTimeout(()=>{
				resolve('徐鹏')
			},1000)
		}).then(res=>{
			console.log(res,'111')
			return Promise.reject('error 徐鹏')
			// throw 'error'
		}).then(res=>{
			console.log(res,'222')
			return Promise.resolve(res+'22')
		}).catch(err=>{
			console.log('333')
			console.log(err)
		})
		
	</script>

四、Promise的all的使用

如果一个需求需要依赖于两个请求结果,怎么办?因为这两个结果是异步调用,你也不知道哪个先来,哪个后来。

我们来做一个模拟例子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	
	<script>
		// Promise.all([
		// 	new Promise((resolve,reject)=>{
		// 		$.ajax({})
		// 	}),
		// 	new Promise((resolve,reject)=>{
		// 		$.ajax({})
		// 	}),
		// ]).then(results=>{
		// 	results[0]
		// 	results[0]
		// })
		Promise.all([
			new Promise((resolve,reject)=>{
				setTimeout(()=>{
					resolve('111')
				},1000)
			}),
			new Promise((resolve,reject)=>{
				setTimeout(()=>{
					resolve('222')
				},2000)
			})
		]).then(results=>{
			console.log(results)
		})
		
	</script>
</html>

猜你喜欢

转载自blog.csdn.net/qq_40594696/article/details/110957668