在学习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的结果呢。
689

被折叠的 条评论
为什么被折叠?



