promise的状态的判断:
- 如果then()方法中返回一个参数值,则状态为fulfilled
- 如果then()方法中抛出一个异常,则状态为rejected
- 如果then()方法中调用resolve(),则状态为fulfilled
- 如果then()方法中调用reject(),则状态为rejected
- 如果then()方法中返回一个padding状态的promise,则状态为padding
- 如果then()方法没有明确的指定时(resolve()/reject()/return data...),那么状态为padding
then方法
调用后返回一个promise对象,这意味着实例化后的promise对象可以进行链式调用,接受两个参数,处理成功结果的函数以及处理失败的函数
<script>
//success
const prm = new Promise((resole, reject) => {
resole(123)
})
//padding
const prm1 = prm.then(res => {
console.log(res);
return new Promise((res, rej) => { })
}, err => {
console.log(err);
})
//padding
const prm2 = prm1.then(res => {
console.log(res);
}, err => {
console.log(err, 'err');
})
</script>
catch方法
与then方法类似,都会返回一个promise对象,主要用于捕获异步操作时出现的异常,因此我们常常省略then方法的第二个参数,将错误处理控制权转交给其后面的catch()函数
<script>
const prm = new Promise((res,rej)=>{
rej('error')
}).then(res=>{
//不会被执行
console.log('success');
}).catch(err=>{
console.log(err);//error
})
</script>
Promise.all方法
此方法接受一个参数,这个参数必须是一个可迭代对象,它通常用来处理一些并发的异步操作,即它们的结果互不干扰,又需要异步操作,它最终只有两个状态:成功或者失败
它的状态受参数内各个值的影响,即里边的状态全部为fulfilled时,状态才为fulfilled,否则为rejected
成功调用后返回一个数组,数组的值是有序的,即按照传入参数的数组的值操作后返回的结果
失败调用后返回失败状态的信息以及值
<script>
const prm1 = new Promise((res,rej)=>{
res(123)
// rej(123); 报错信息...123
})
const prm2 = 42;
const prm3 = new Promise((res,rej)=>{
res(456)
})
Promise.all([prm1,prm2,prm3]).then(value=>{
console.log(value);//[123,42,456]
})
</script>
Promise.race方法
与Promise.all类似,都接收一个可迭代对象,但是Promise.race的状态不是全部受参数内的状态影响,一旦参数内有一个值的状态发生改变,那么该Promise的状态就会发生改变
<script>
const prm1 = new Promise((res,rej)=>{
setTimeout(()=>{
res(123)
},1000)
})
const prm2 = 42;
const prm3 = new Promise((res,rej)=>{
res(456)
})
Promise.race([prm1,prm2,prm3]).then(value=>{
console.log(value);//42
})
</script>
Promise.resolve
接收一个参数值,可以是普通的值,具有then()方法的对象以及Promise实例,正常情况下,返回一个Promise对象,状态为fulfilled,若解析错误则返回的Promise对象的状态为rejected
<script>
const p1 = Promise.resolve(5).then(data=>{
console.log(data);//5
})
const obj = {
then(){
console.log('具有then方法的对象');
}
}
const p2 = Promise.resolve(obj).then(res=>{});//相当于调用obj.then,只不过返回值是一个Promise对象
const p3 = Promise.resolve(3);
const p4 = Promise.resolve(p3).then(res=>{
console.log(res);//3
})
const p5 = Promise.reject(5);
const p6 = Promise.resolve(p5)
p6.then(res=>{
console.log('success',res);
}).catch(err=>{
console.log('error',err);//error 5
})
</script>
Promise.reject
与Promise.resolve正好相反,它接收一个参数值,即发生异常的原因,此时返回的Promise对象的状态就是rejected
const p1 = Promise.reject('手动拒绝');
p1.then(res=>{
console.log('不执行');
}).catch(err=>{
console.log(err);//手动拒绝
})
----------------完毕-----------------------
总之,除非then方法抛出异常或者是明确置为rejected,否则它返回的Promise对象一直都是fulfilled,并且它的状态不受上一级的影响