Promise是ES6新增的一个内置类
- 通过new Promise() 我们可以得到一个Promise实例,实例有两个属性
-
PromiseStatus(状态):
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
-
PromiseValue
- 存放的是Promise的值
-
PromiseStatus(状态):
new Promise的时候可以传一个executor函数(可执行函数),执行new Promise的时候会立刻把它执行,函数有两个参数,分别是resolve/reject,这两个参数都是函数,可以在 executor 执行的时候使用,执行后分别把Promise实例的状态值改为resolved/rejected,方法传的参数则为实例的Value值
我们所说的Promise的异步指的是resolve/rejected执行
- 执行两个方法(其中一个)的时候不仅仅是修改状态和值,还要通知then存储的两个回调函数中的一个执行
Promise的then链机制:
then()中,放两个回调函数,如果实例的状态是resolved,则把第一个方法执行,如果是rejected则把第二个方法执行,参数为使用resolve/reject方法时传的参数。
.then返回的是一个promise实例,return的值作为下一个.then时resolove的参数,.then不论是哪个回调函数执行,只要执行不报错,返回的promise实例状态都为resolove,除非return了一个new promise 此时以return的promise实例为主
then链的顺延机制:如果状态一但确定,想去执行.then注入的某个方法,但是此方法没有被注册,则向下顺延(找下一个then中注册的对应方法)
Promse.all/Promise.race
- 返回一个的新的promise实例
- all等待所有promise实例都是成功,整体返回的实例才是成功(都对整体才是对,只要有一个假,整体就是假)
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
- race等待最新有返回结果的promise实例,此实例的成功和失败决定最后的成功和失败(赛跑:谁快听谁的)
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"
async、await是Promise的一个语法糖:
- 我们可以将await关键字后面执行的代码,看做是包裹在(resolve, reject) => {函数执行}中的代码;
- await的下一条语句,可以看做是then(res => {函数执行})中的代码;