Promise

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const p = new Promise((resolve, reject) => {


// 如果异步操作成功,使用resolve带出其需返回的结果
resolve(data);

// 如果异步操作失败,使用reject带出其需返回的结果
resolve(err);
})

// 当我们调用时
p
.then((data) => {
// 使用then获取异步成功后的返回值
})
.catch((err) => {
// 使用catch捕获异步失败后的返回值
})

在then方法中,我们可以return一个Promise对象,然后链式调用then方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const p = new Promise((resolve, reject) => {


// 如果异步操作成功,使用resolve带出其需返回的结果
resolve(data);

// 如果异步操作失败,使用reject带出其需返回的结果
reject(err);
})

// 当我们调用时
p
.then((data) => {
// 使用then获取异步成功后的返回值
return new Promise((resolve, reject) => {
resolve('我是第一个then的resolve值');
})
})
.then((data) => {
console.log(data); // 我是第一个then的resolve值
})
.catch((err) => {
// 使用catch捕获异步失败后的返回值
})

catch用来捕获reject的返回值,每个链式调用只能有一个catch,不管哪个then中出现了reject,都会被catch捕获到。一旦出现reject,接下来的then都不会再执行。

Promise.all() & Promise.race()

Promise.all() 和 Promise.race() 用来并发执行所有的promise。

1
2
3
4
5
6
7
const p1 = new Promise((resolve, reject) => { resolve(1); })
const p2 = new Promise((resolve, reject) => { resolve(2); })
const p3 = new Promise((resolve, reject) => { resolve(3); })

Promise.all([p1, p2, p2]);

Promise.race([p1, p2, p2]);

对于Promise.all()

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

对于Promise.race()

  • 只有p1,p2或p3的任意一个有了resolve,Promise.race()就会执行一个then,then的参数就是当前resolve的返回值。
  • 只要p1、p2、p3之中有一个被reject,Promise.race()就会执行catch,catch的参数就是当前reject的返回值。

Promise.resolve()

将入参作为一个Promise返回,入参可以是

  • 一个Promise实例
  • thenable对象
  • 一个原始值
  • 一个一个不具有then方法的对象
  • 没有入参