深入了解请看我更的上一篇文章 js的同步和异步
什么是promise?
promise是一种异步编程的解决方案:可以异步获取操作的信息,从而解决JS单线程的一些弊端。
promise有三种状态: pending(准备态), resolved(成功态),rejected(失败态)。状态一旦改变是不可逆的。
为什么要有promise?
JS本身是单线程的,在遇到某些方法或者是执行时间比较长的时候,这样后面的代码就会出现阻塞,无法继续运行。(就会造成页面的卡顿,影响用户体验)。
promise的使用——代码示例
let p=new Promise((resolve,reject)=>{
// resolve("resolved")
// reject("rejected")
});
p.then((res)=>{
console.log(res)//resolved
}).catch((err)=>{
console.log(err)//rejected
});
resolve和reject(可结合上面的代码段)
promise的构造函数里直接传入了一个函数,我们可一称他为executor,两个参数resolve和reject,executor会立即异步执行,函数内可以写自己的代码逻辑,根据代码执行逻辑,一般成功会调用resolve,失败调用reject,改变状态,状态一经改变不可逆。
resolve:‘
会把promise的pending(准备态)变为resolved(成功态)。
reject:
会把promise的pending(准备态)变为rejected(失败态)。
then和catch(可结合上面代码段)
then:
当promise的状态为resolved(成功态)时,会调用then方法里面的函数接受一个参数,也就是resolve()传入的值。
catch:
当promise的状态为rejected(失败态)时,会调用catch方法里面的函数接受一个参数,也就是reject()传入的值。
promise中的all方法
let p1=Promise.resolve("p1成功");
let p2=Promise.resolve("p2成功");
let pAl=Promise.all([p1,p2]);
pAl.then((res)=>{
console.log(res);//['p1成功','p2成功']
console.log("全部成功");
}).catch((err)=>{
console.log(err);//这里打印第一个状态值为失败态的返回值
console.log("没有全部成功");
});
all方法的参数是一个promise对象数组,数组中的promise对象状态全部都为resolved,该对象的状态就是resolved,then中的函数获取的参数值为数组,是all方法里传的所有的promise对象返回的值拼接的数组,否则就是rejected,catch中的值返回第一个promise对象的失败状态的返回值。
promise中的race方法
let p1=Promise.resolve("p1成功");
let p2=new Promise((resolve,reject)=>{
setTimeout(() => {
resolve('p2成功')
}, 200);
});
let pRace=Promise.race([p1,p2]);
pRace.then((res)=>{
console.log(res)
}).catch((err)=>{
console.log(err)
});
race方法的参数是一个promise对象数组,数组中所有的promise对象中执行最快的一个,不论状态成功还是失败,该对象就为何种状态,then和catch就与其对应。
假如你看到了这里,文章对你有帮助的话,希望能帮忙点个赞哦,小破船谢谢大家了。