Promise
一、Promise实例的状态
- pedding 初始的状态,即等待
- rejected 返回的promise对象属性值,代表失败
- fulfilled 返回的promise对象属性值,代表成功
以上状态保存在实例属性的PromiseState中,同样的也有一个实例属性PromiseResult保存执行结果。
二、改变Promise对象状态?
- 调用 resolve 函数(状态是成功)
- 调用 reject 函数(状态是失败)
- 使用throw关键字抛出异常(状态是失败)
- 构造函数生成的结果值跟return内容无关,只和resolve和reject函数有关;
有特殊的情况,见原型中的方法
三、静态方法和原型上的方法
then:参数一是成功状态要执行的函数,参数二是失败状态要执行的函数。then方法的返回值是一个promise实例对象,该对象默认为成功状态,该实例对象的结果值是return的内容或者reuturn一个Promise对象的成功状态;另外一种状态是失败状态,通常抛出错误或者reutrn一个Promise对象的失败状态。
resolve:如果参数不是Promise函数,则都是成功状态;如果是Promise函数,则看这个Promise返回的状态,如果返回reject()函数,则是失败状态,那么外层的resolve函数的返回结果也是失败状态的Promise函数。
reject:无论传入什么,返回结果都是失败状态的Promise函数。
catch:仅对失败状态的Promise函数进行处理
all: 有一个array参数,里面是Promise函数的实例对象,如果他们都是成功,则该方法返回值是成功;如果有一个失败,则该方法返回值是失败。
race:和all方法类似,只不过返回的结果是根据第一个Promise实例对象的状态决定。
四、其他情况
Q:可以执行多个回调函数吗?
可以的。
Q: 什么是异常穿透?
在串联调用的时候(then方法),把catch方法放在最后一个then方法后,它会捕捉到上面的Promise调用链最后一个返回的失败结果。
Q: 如何中断Promise链?(不往下执行then方法)
返回一个pedding状态的Promise对象。
五、附加:async和await
1. await 只能放在async修饰的函数中,await 会等待右侧返回的promise函数状态改变(其中必须包含promise对象,也可以跟任意表达式,但是没有什么用),同时会暂停后续代码的执行。return 会改变返回的Promise对象的PromiseResult值。
2. async 修饰的函数返回值一定是隐式返回Promise对象。
3. 返回的promise对象状态
返回的promise对象为成功状态的方式:
-
-
-
- return 或 await 成功状态Promise对象,结果值只能通过return返回出来;
- 没有任何返回操作,结果值为undefiend;
-
-
返回的promise对象为失败状态的方式:
-
-
-
- return 或 await 失败的promise对象,结果值取决于传入resolve方法的内容;
- 抛出一个错误,其promise结果值为undefiend;
-
-
注意:await只能在async修饰的函数中使用,而async修饰的函数中可以没有await。