1、使用语法
new Promise((resolve,reject)=>{
...
})
//构造函数,传入两个方法作为形参
2、状态和结果
一个Promise实例有两个属性,状态和结果。状态有三种:Pending,fulfilled和rejected,分别代表挂起,成功和失败。
在构造函数时(也就是上面),改变状态和结果可以通过调用以下方法:
resolve(e);
//改变当前Promise的 状态 为fulfilled(已成功)并将参数传入当前Promise作为 结果
reject(e);
//改变当前Promise的 状态 为rejected(已失败)并将参数传入当前Promise作为 结果
*Promise的状态仅能转变一次。
结合1,一个起步的promise实例应该是这样的:
const P = new Promise((resolve,reject)=>{
var n = 1
var m = 1
if(m + n == 2){
resolve("一加一等于二");
}else{
reject("一加一不等于二!");
}
})
3、then方法
then((value1)=>{},(value2)=>{});
Promise原型中的方法,可以直接调用。但在Promise状态未被改变时,then方法不会被执行。这也就是Promise的核心思想,在前面的代码还未被执行或是正在等待结果时,后面的嵌套会一直被挂起。可以理解成将异步执行的回调地狱优化成同步执行。
两个形参分别是:
1、Promise的状态为fulfilled时调用的方法函数,参数value1为Promise的结果;
2、Promise的状态为rejected时调用的方法函数,参数value2亦为当前Promise的结果。
换句话说,then方法就是在Promise执行不出错的情况下,以其当前状态为来选择执行不同的后续方法。
then方法在调用后,返回值是一个全新的Promise,状态为Pending(挂起),也就是说,then方法可以使用链式操作来执行嵌套:
const p = Promise()
p.then().then().then()
在then方法被调用时,可以在两个分支中分别return来设置then返回值,也就是下一个嵌套中Promise的状态(第一个对应fulfilled,后一个对应rejected):通过这种方法可以更好的执行嵌套。当然,函数默认return undefine,什么都不写也是可以设置成fulfilled的。
tips:当代码出错时会返回rejected
4、catch方法
catch((reason)=>{})
Promise原型中的方法,可以直接调用。当Promise状态为rejected或代码出错时(人为抛出错误也算)就会被执行。
5、总结
简单来说就是:
promise是一个实例,他有两个属性:状态和值。
然后分成两部分:
第一部分是构造promise,设定在什么情况下,利用resolve(e)和reject(e)这两个方法将promise的状态改成fulfilled/rejected,也就是成功/失败,并将e传入promise的值
第二部分是调用promise下的then方法,then只有在检测到了promise状态被改变的情况下才会执行。then里可以设置两种状态分别执行什么操作,比如获取当前的值(第一步中传入的)
最后then也会继续返回一个promise实例(then也就是一个promise),故在then中也可以继续调用两种改变状态的方法,并如同p.then().then()的形式进行嵌套调用。
大部分教程转载自最好理解的Promise教程_哔哩哔哩_bilibili