作者:娜娜的乖宝宝699 | 来源:互联网 | 2023-09-25 21:56
promise出现的目的一为处理JavaScript里的异步,再就是避免回调地狱。promise有三种状态:pendingreslovereject。pending就是未决,res
promise出现的目的一为处理Javascript里的异步,再就是避免回调地狱。 promise有三种状态:pending/reslove/reject 。
pending就是未决,resolve可以理解为成功,reject可以理解为拒绝。 promise的最终状态会凝固,成功了以后即便再执行reject ('failed')状态也不会改变。
Promise是一个构造函数,自己身上有all、reject、resolve这几个的方法,原型上有then、catch等同样的方法。这么说用Promise new出来的对象肯定就有then、catch方法。
我们创建一个实例就可以使用这些方法了。
let Mypromise = new Promise(function(resolve,reject){
setTimeout(function(){
let a = 22;
let b = 20;
if(a>b){
// 如果走了resolve,则触发.then,把a+b的值传入.then
resolve(a+b);
}else{
// 如果走了reject,则触发.catch,输出err 'b>a'
reject('b>a');
}
},2000);
});
// 当b>a的时候,Mypromise.then这串代码不会被触发
Mypromise.then(function(value){
console.log('2s后');
console.log(value,'value');
// 如果 then 中返回的是一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作
// 记得如果还想继续给下一个.then传参数,就必须要return
return new Promise(function(resolve,reject){
setTimeout(function(){
let c = 41;
if(c<value){
// 如果走了resolve,则触发.then,把value-c的值传入.then
resolve(value-c);
}else{
// 如果走了reject,则触发.catch,输出err 'c>value'
reject('c>value');
}
},1000)
})
}).then(function(data){
console.log('1s后');
console.log(data,'data');
})
.catch(function(err){
console.log(err)
})
可以看到这串代码是当a>b的时候走的resolve,否则走reject,首先我们要知道,当触发resolve的时候就会去执行.then(),触发reject的时候就会执行.catch(),
a=22,b=20,所以a>b,走resolve,resolve传递了a+b的值给了.then,
也就是把42传递给了.then,这个时候执行了.then(),首先输出了value,也就是resolve传递下来的值,(注意这里的value可以随便取名),
然后.then()中有一个新的promise,如果 then 中返回的是一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作,
还有就是如果还想继续给下一个.then传参数,就必须要return,如果不return的话那么结果将会变为42和undifinded,
promise 不能返回值只能返回promise,因为它是异步的,要用就得 fn1().then(value => console.log(value))
的方式拿到值,
所以到第二个promise的时候走了resolve,执行.then,第二个.then通过第一个.then,return把value-c的值传到了.then中输出了date,
如果我们把b改为25会怎样呢?
let Mypromise = new Promise(function(resolve,reject){
setTimeout(function(){
let a = 22;
let b = 25;//变成了25
if(a>b){
// 如果走了resolve,则触发.then,把a+b的值传入.then
resolve(a+b);
}else{
// 如果走了reject,则触发.catch,输出err 'b>a'
reject('b>a');
}
},2000);
});
// 当b>a的时候,Mypromise.then这串代码不会被触发
Mypromise.then(function(value){
console.log('2s后');
console.log(value,'value');
// 如果 then 中返回的是一个 Promise 对象,那么下一个 then 将相当于对这个返回的 Promise 进行操作
// 记得如果还想继续给下一个.then传参数,就必须要return
return new Promise(function(resolve,reject){
setTimeout(function(){
let c = 41;
if(c<value){
// 如果走了resolve,则触发.then,把value-c的值传入.then
resolve(value-c);
}else{
// 如果走了reject,则触发.catch,输出err 'c>value'
reject('c>value');
}
},1000)
})
}).then(function(data){
console.log('1s后');
console.log(data,'data');
})
.catch(function(err){
console.log(err)
})
把b改为25,b比a大所以走了reject,这时候就只输出了一个'b>a',
因为他没走resolve,所以自然不会触发.then,所以下面的代码块也不会执行。
纯属小白学习笔记,如果有不正确的,还望各位大佬指正!!!