promise的学习

在学习vue的时候,会看到Promise。

个人理解,如有错误请包涵

为了解决某些异步的问题,比如多层嵌套,让写法更加优美

最基本的写法

let a = new Promise((resolve,reject)=>{
		let r = Math.random()*10;
		if(r>5){
			resolve(r)
         }else{
			reject(r)
		}
	});
    a.then(res=>{
 			console.log('a resolve')
			console.log('a',res);
	}).catch(e=>{
		console.log('a reject')
		console.log(e)
});

一般不会直接创建一个a 即 一个Promise对象,会用一个函数返回,当要使用的时候调用这个函数

	function a(){ 
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r)
			         }else{
						reject(r)
					}
				});
			}
	a().then(res=>{
					console.log('a resolve')
					console.log('a',res);
			}).catch(e=>{
				console.log('a reject')
				console.log(e)
	});

上面代码就有点像封装的axios了,
随机数来用来确认是走resolve还是reject
then来接收上面resolve里面的值
catch来接收上面reject里面的值

什么?你看到不停的then,而不是一个then接一个catch
情况1:

           function a(){ 
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r)
			         }else{
						reject(r)
					}
				});
			}
			a().then(res=>{
						console.log('a resolve')
						console.log('a',res);
						return 2
				}).then(res=>{
						console.log('a resolve')
						console.log('a',res);
						return 2
				}).catch(e=>{
					console.log('a reject')
					console.log(e)
			});

第一个then里面有一个返回值,那么第二个then里面接收到第一个then后面的情况

情况2
返回的还是一个Promise,其实还是和上面一样。

		function a(){ 
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r)
			         }else{
						reject(r)
					}
				});
			}
			
			function b(){
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r)
			         }else{
						reject(r)
					}
				});
			}
			
			  b().then(res=>{
						console.log('b resolve')
						console.log('b',res);
						return a()
				}).then(res=>{
						console.log('a resolve')
						console.log('a',res);
						return 2
				}).catch(e=>{
					console.log('2次then后的e')
					console.log(e)
			});

第一个then的到的是b函数内部的结果,第二个then是的到的return里a函数返回的promise的结果
在这里插入图片描述
这里有疑问,那如果进入的是进入的是reject里呢, catch 怎么处理?
这一次b进入solve,a进入reject
在这里插入图片描述
结果是获取到了a的reject.
问题来了,如果
b进入reject, a也进入reject ,怎么搞?
我修改了下代码
在这里插入图片描述
跑了一下
在这里插入图片描述
我们没确定怎么走的
在这里插入图片描述
上面b走了resole,那么catch捕获的是a的结果
在这里插入图片描述
这次then都能捕获,那么没走catch

接受的是b的reject,那a如果也进入reject,是什么结果呢
我们试试加两个catch
在这里插入图片描述
我试了多次最后一个catch不会出现,so ,catch只能获取第一个reject的结果。多个catch除了第一个,其他catch都没有用,也不报错。

注意,我这是做微信小程序,用hBuild的uniapp框架下实验的。

Promise.all方法

.then的方法很好用,但是catch不到第二个的错误,我们想办法搞一下

		function a(){ 
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r+'a')
			         }else{
						reject(r+'a')
					}
				});
			}
		
			function b(){
				return new Promise((resolve,reject)=>{
					let r = Math.random()*10;
					if(r>5){
						resolve(r+'b')
			         }else{
						reject(r+'b')
					}
				});
			}
			Promise.all([a(),b()]).then(res=>{
				console.log('ok')
				console.log(res);
			}).catch(res=>{
				console.log('error');
				console.log(res)
			})
			

两个都走resolve
在这里插入图片描述
下面是走catch的情况
在这里插入图片描述
在这里插入图片描述

这不给力啊, 有没有其他方法,能够返回两个catch的结果呢。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值