2023-05-21 14:16:46 +08:00
|
|
|
|
## Promise 实例的方法简介
|
|
|
|
|
|
|
|
|
|
Promise 的 API 分为两种:
|
|
|
|
|
|
|
|
|
|
- Promise 实例的方法(也称为:Promis的实例方法)
|
|
|
|
|
- Promise 类的方法(也称为:Promise的静态方法)
|
|
|
|
|
|
|
|
|
|
Promise **实例**的方法:我们需要先 new 一个 promise 实例对象,然后通过 promise 实例去调用 `then`、`catch`、`finally`方法。这几个方法就是 Promise 的实例方法。
|
|
|
|
|
|
|
|
|
|
Promise 实例提供了如下方法:
|
|
|
|
|
|
|
|
|
|
- promise.then():获取异步任务的正常结果。
|
|
|
|
|
|
|
|
|
|
- promise.catch():获取异步任务的异常结果。
|
|
|
|
|
|
|
|
|
|
- promise.finaly():异步任务无论成功与否,都会执行。
|
|
|
|
|
|
|
|
|
|
我们在上一篇文章《Promise入门详解》中,用到的都是Promise实例的方法。本篇文章,我们来把这三个实例方法进一步详细学习一下。
|
|
|
|
|
|
|
|
|
|
## Promise 实例的 then()方法
|
|
|
|
|
|
|
|
|
|
### then()方法的参数
|
|
|
|
|
|
|
|
|
|
then()方法是 Promise实例上的一个方法。它其实是放在Promise的原型上的 `Promise.prototype.then`。
|
|
|
|
|
|
|
|
|
|
then()方法可以接收一个参数,也可以接收两个参数。两个参数时,分别代表两个回调函数,这两个函数一直处于**监听状态**:
|
|
|
|
|
|
|
|
|
|
- 参数1:当 Promise 的状态变为 fulfilled(意思是:任务执行成功)时会立即执行的回调函数。
|
|
|
|
|
|
|
|
|
|
- 参数2:当 Promise 的状态为 rejected(任务执行失败)时会立即执行的回调函数。
|
|
|
|
|
|
|
|
|
|
下面这两种写法是等价的。处理 rejected 失败状态的回调函数,既可以放在 then() 方法的第二个参数里,也可以单独放在 catch() 方法的参数里。
|
|
|
|
|
|
|
|
|
|
写法1:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const promise = new Promise((resolve, reject) => {
|
|
|
|
|
reject('qianguyihao');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
promise.then(
|
|
|
|
|
res => {
|
|
|
|
|
console.log('res:', res);
|
|
|
|
|
},
|
|
|
|
|
err => {
|
|
|
|
|
console.log('err:', err);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
写法2:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const promise = new Promise((resolve, reject) => {
|
|
|
|
|
reject('qianguyihao');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
promise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res:', res);
|
|
|
|
|
})
|
|
|
|
|
.catch(err => {
|
|
|
|
|
console.log('err:', err);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### then()方法可以被多次调用
|
|
|
|
|
|
|
|
|
|
一个 Promise 的 then() 方法可以被多次调用。每次调用时我们都可以传入对应fulfilled状态的回调函数。当 Promise 的状态变为 fulfilled 时,这些回调函数都会被执行。
|
|
|
|
|
|
|
|
|
|
then被调用多次的伪代码:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise();
|
|
|
|
|
|
|
|
|
|
myPromise.then();
|
|
|
|
|
myPromise.then();
|
|
|
|
|
myPromise.then();
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
代码举例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('qianguyihao');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.then(res => {
|
|
|
|
|
console.log('成功回调1');
|
|
|
|
|
console.log('res1:', res);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.then(res => {
|
|
|
|
|
console.log('成功回调2');
|
|
|
|
|
console.log('res2:', res);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.then(res => {
|
|
|
|
|
console.log('成功回调3');
|
|
|
|
|
console.log('res3', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
成功回调1
|
|
|
|
|
res1: qianguyihao
|
|
|
|
|
|
|
|
|
|
成功回调2
|
|
|
|
|
res2: qianguyihao
|
|
|
|
|
|
|
|
|
|
成功回调3
|
|
|
|
|
res3 qianguyihao
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
代码解释:
|
|
|
|
|
|
|
|
|
|
当 myPromise 状态为 fulfilled 时,下面的四个 then() 方法**都在监听**,所以这四个 then() 方法都会收到状态确定的通知,进而都会执行。
|
|
|
|
|
|
|
|
|
|
此外,then() 被调用多次还有一种**链式调用**的写法,它的打印结果与上面的打印结果不同,想要了解 Promise 的链式调用,需要先学习 then() 方法的返回值,我们继续往下看。
|
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
## then() 方法传入回调函数的返回值
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
> 这一段的知识点略有难度,但也很重要。
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
### 默认返回值
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
then()方法的参数里,是一个回调函数。这个回调函数**默认是有返回值**的,它的返回值是一个**新的Promise**。正是因为这样,我们才可以进行链式调用。
|
|
|
|
|
|
|
|
|
|
这个新 Promise 的决议时机是等到当前 then() 方法参数里传入的回调函数有返回值时,进行决议。当返回值这行代码执行完毕后,这个 新 Promise 会立即进入 fulfilled 状态,进而触发下一个 then()的执行。同时可以给下一个 then()传递参数。
|
|
|
|
|
|
|
|
|
|
特殊情况:
|
|
|
|
|
|
|
|
|
|
当then()方法传入的回调函数抛出一个异常时,那么,这个新 Promise 处于reject状态。
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
|
|
|
|
Promise 链式调用的伪代码:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
// 伪代码
|
2023-05-21 16:07:48 +08:00
|
|
|
|
myPromise.then().then().catch()
|
2023-05-21 14:16:46 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
上方代码中,因为 myPromise.then() 的返回值本身就是一个 Promise,所以才可以继续调用 then(),继续调用 catch()。
|
|
|
|
|
|
|
|
|
|
then() 链式调用的代码举例:
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('qianguyihao');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('成功回调1');
|
|
|
|
|
console.log('res1:', res);
|
2023-05-21 16:07:48 +08:00
|
|
|
|
/*
|
|
|
|
|
这里虽然什么都没写,底层默认写了如下代码:
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
resolve(); // resolve() 的参数是空
|
|
|
|
|
})
|
|
|
|
|
*/
|
2023-05-21 14:16:46 +08:00
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('成功回调2');
|
|
|
|
|
console.log('res2:', res);
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('成功回调3');
|
|
|
|
|
console.log('res3', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
成功回调1
|
|
|
|
|
res1: qianguyihao
|
|
|
|
|
|
|
|
|
|
成功回调2
|
|
|
|
|
res2: undefined
|
|
|
|
|
|
|
|
|
|
成功回调3
|
2023-05-21 16:07:48 +08:00
|
|
|
|
res3:undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
代码解释:
|
|
|
|
|
|
|
|
|
|
第一个 then()里的回调,是由 myPromise 进行决议。第二个then()、第三个then() 也在**等待决议**。
|
|
|
|
|
|
|
|
|
|
但是,**第二个 then() 的回调是由第一个 then()传入的回调函数,返回的 Promise 进行决议**;第三个 then() 的回调是由第二个 then()传入的回调函数,返回的 Promise 进行决议,以此类推。所以,这两个then()里面的打印参数的结果是 undefined,并没有打印 myPromise 的决议结果。
|
|
|
|
|
|
|
|
|
|
换句话说,第一个 then() 在等待 myPromise 的决议结果,有决议结果后执行;第二个 then() 在等待第一个 then()参数里返回的新 Promise的决议结果,有决议结果后执行;第三个 then() 在等待第二个 then()参数里返回的新 Promise的决议结果,有决议结果后执行。
|
|
|
|
|
|
|
|
|
|
此外,我们也可以在 then()的回调函数里,手动 return 自己想要的数据类型,可以有以下几种情况。
|
|
|
|
|
|
|
|
|
|
### 返回普通值
|
|
|
|
|
|
|
|
|
|
代码举例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('1号');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res1:', res);
|
|
|
|
|
return '2号';
|
|
|
|
|
/*
|
|
|
|
|
上面这行 return,相当于:
|
|
|
|
|
return new Promise((resolve, reject)=> {
|
|
|
|
|
resolve('2号');
|
|
|
|
|
})
|
|
|
|
|
*/
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res2:', res);
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res3:', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
返回结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
res1: 1号
|
|
|
|
|
res2: 2号
|
|
|
|
|
res3: undefined
|
2023-05-21 14:16:46 +08:00
|
|
|
|
```
|
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
### 返回新的 Promise
|
|
|
|
|
|
|
|
|
|
代码举例:
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('qianguyihao fulfilled 1');
|
|
|
|
|
});
|
|
|
|
|
const myPromise2 = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('qianguyihao fulfilled 2');
|
|
|
|
|
});
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
myPromise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res1:', res);
|
|
|
|
|
return myPromise2;
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
// 监听 myPromise2 的决议:
|
|
|
|
|
console.log('res2:', res);
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res3', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
res1: qianguyihao fulfilled 1
|
|
|
|
|
res2: qianguyihao fulfilled 2
|
|
|
|
|
res3 undefined
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 返回 thenable 对象
|
|
|
|
|
|
|
|
|
|
代码举例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
resolve('qianguyihao fulfilled 1');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res1:', res);
|
|
|
|
|
return {
|
|
|
|
|
then: (resolve, reject) => {
|
|
|
|
|
resolve('thenable fulfilled');
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res2:', res);
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res3', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
res1: qianguyihao fulfilled 1
|
|
|
|
|
res2: thenable fulfilled
|
|
|
|
|
res3 undefined
|
|
|
|
|
```
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
|
|
|
|
## Promise 实例的 catch() 方法
|
|
|
|
|
|
|
|
|
|
### catch() 方法的参数
|
|
|
|
|
|
|
|
|
|
catch()方法可以接收一个参数。这个参数是一直处于**监听状态**的回调函数。当 Promise 的状态为 rejected(任务执行失败)时会立即执行这个回调函数。
|
|
|
|
|
|
|
|
|
|
代码举例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const promise = new Promise((resolve, reject) => {
|
|
|
|
|
reject('qianguyihao reject');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
promise
|
|
|
|
|
.then(res => {
|
|
|
|
|
console.log('res:', res);
|
|
|
|
|
})
|
|
|
|
|
.catch(err => {
|
|
|
|
|
console.log('err:', err);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
err: qianguyihao reject
|
|
|
|
|
```
|
|
|
|
|
|
2023-05-21 16:07:48 +08:00
|
|
|
|
当 Promise 状态为 rejected 时,如果不写失败的回调,行不行呢?不行,会报错。代码举例:
|
2023-05-21 14:16:46 +08:00
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const promise = new Promise((resolve, reject) => {
|
|
|
|
|
reject('qianguyihao reject');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
promise.then(res => {
|
|
|
|
|
console.log('res:', res);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
![image-20230521135912267](https://img.smyhvae.com/image-20230521135912267.png)
|
|
|
|
|
|
|
|
|
|
这个报错的意思是:未捕获 rejected 失败状态的 Promise 异常。
|
|
|
|
|
|
|
|
|
|
### catch() 方法可以被多次调用
|
|
|
|
|
|
|
|
|
|
一个 Promise 的 catch() 方法可以被多次调用。每次调用时我们都可以传入对应 rejected 状态的回调函数。当 Promise 的状态变为 rejected 时,这些回调函数都会被执行。
|
|
|
|
|
|
|
|
|
|
catch() 被调用多次的伪代码:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise();
|
|
|
|
|
|
|
|
|
|
myPromise.catch();
|
|
|
|
|
myPromise.catch();
|
|
|
|
|
myPromise.catch();
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
代码举例:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
const myPromise = new Promise((resolve, reject) => {
|
|
|
|
|
reject('qianguyihao rejected');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.catch(err => {
|
|
|
|
|
console.log('失败回调1');
|
|
|
|
|
console.log('err1:', err);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.catch(err => {
|
|
|
|
|
console.log('失败回调2');
|
|
|
|
|
console.log('err2:', err);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
myPromise.catch(err => {
|
|
|
|
|
console.log('失败回调3');
|
|
|
|
|
console.log('err3:', err);
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
打印结果:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
失败回调1
|
|
|
|
|
err1: qianguyihao rejected
|
|
|
|
|
|
|
|
|
|
失败回调2
|
|
|
|
|
err2: qianguyihao rejected
|
|
|
|
|
|
|
|
|
|
失败回调3
|
|
|
|
|
err3: qianguyihao rejected
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
代码解释:
|
|
|
|
|
|
|
|
|
|
当 myPromise 状态为 rejected 时,下面的四个 catch() 方法**都在监听**,所以这四个 catch() 方法都会收到状态确定的通知,进而都会执行。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 处理 reject 失败状态的两种写法
|
|
|
|
|
|
|
|
|
|
我们有两种写法可以捕获并处理 reject 异常状态:
|
|
|
|
|
|
|
|
|
|
- 写法 1:通过 catch 方法捕获 状态变为已 reject 时的 promise
|
|
|
|
|
|
|
|
|
|
- 写法 2:then 可以传两个参数,第⼀个参数为 resolve 后执⾏,第⼆个参数为 reject 后执⾏。
|
|
|
|
|
|
|
|
|
|
### 代码格式
|
|
|
|
|
|
|
|
|
|
这两种写法的**代码格式**如下:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
// 第一步:model层的接口封装
|
|
|
|
|
function promiseA() {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
// 这里做异步任务(比如 ajax 请求接口,或者定时器)
|
|
|
|
|
...
|
|
|
|
|
...
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const onResolve = function (res) {
|
|
|
|
|
console.log(res);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onReject = function (err) {
|
|
|
|
|
console.log(err);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 写法1:通过 catch 方法捕获 状态变为已拒绝时的 promise
|
|
|
|
|
promiseA().then(onResolve).catch(onReject);
|
|
|
|
|
|
|
|
|
|
// 写法2:then 可以传两个参数,第⼀个参数为 resolve 后执⾏,第⼆个参数为 reject 后执⾏
|
|
|
|
|
promiseA().then(onResolve, onReject);
|
|
|
|
|
|
|
|
|
|
// 【错误写法】写法3:通过 try catch 捕获 状态变为已拒绝时的 promise
|
|
|
|
|
// 这种写法是错误的,因为 try catch只能捕获同步代码里的异常,而 promise.reject() 是异步代码。
|
|
|
|
|
try {
|
|
|
|
|
promiseA().then(onResolve);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// 语法上,catch必须要传入一个参数,否则报错
|
|
|
|
|
onReject(e);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
如注释所述:前面的段落里,我们捕获 reject 异常用的就是写法 1。如果你写法 2 也是可以的。
|
|
|
|
|
|
|
|
|
|
需要注意的是,上面的写法 3 是错误的。运行之后,控制台会报如下错误:
|
|
|
|
|
|
|
|
|
|
![](http://img.smyhvae.com/20210430_1553.png)
|
|
|
|
|
|
|
|
|
|
[解释如下](https://blog.csdn.net/xiaoluodecai/article/details/107297404):
|
|
|
|
|
|
|
|
|
|
try-catch 主要用于捕获异常,注意,这里的异常是指**同步**函数的异常。如果 try 里面的异步方法出现了异常,此时 catch 是无法捕获到异常的。
|
|
|
|
|
|
|
|
|
|
原因是:当异步函数抛出异常时,对于宏任务而言,执行函数时已经将该函数推入栈,此时并不在 try-catch 所在的栈,所以 try-catch 并不能捕获到错误。对于微任务而言(比如 promise)promise 的构造函数的异常只能被自带的 reject 也就是.catch 函数捕获到。
|
|
|
|
|
|
|
|
|
|
(2)写法 1 中,`promiseA().then().catch()`和`promiseA().catch().then()`区别在于:前者可以捕获到 `then` 里面的异常,后者不可以。
|
|
|
|
|
|
|
|
|
|
### 代码举例
|
|
|
|
|
|
|
|
|
|
这两种写法的**代码举例**如下:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
function promiseA() {
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
// 这里做异步任务(比如 ajax 请求接口,或者定时器)
|
|
|
|
|
...
|
|
|
|
|
...
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 写法1
|
|
|
|
|
promiseB()
|
|
|
|
|
.then((res) => {
|
|
|
|
|
// 从 resolve 获取正常结果
|
|
|
|
|
console.log('接口请求成功时,走这里');
|
|
|
|
|
console.log(res);
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => {
|
|
|
|
|
// 从 reject 获取异常结果
|
|
|
|
|
console.log('接口请求失败时,走这里');
|
|
|
|
|
console.log(err);
|
|
|
|
|
})
|
|
|
|
|
.finally(() => {
|
|
|
|
|
console.log('无论接口请求成功与否,都会走这里');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 写法 2:(和写法 1 等价)
|
|
|
|
|
promiseB()
|
|
|
|
|
.then(
|
|
|
|
|
(res) => {
|
|
|
|
|
// 从 resolve 获取正常结果
|
|
|
|
|
console.log('接口请求成功时,走这里');
|
|
|
|
|
console.log(res);
|
|
|
|
|
},
|
|
|
|
|
(err) => {
|
|
|
|
|
// 从 reject 获取异常结果
|
|
|
|
|
console.log('接口请求失败时,走这里');
|
|
|
|
|
console.log(err);
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
.finally(() => {
|
|
|
|
|
console.log('无论接口请求成功与否,都会走这里');
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**代码解释**:写法 1 和写法 2 的作用是完全等价的。只不过,写法 2 是把 catch 里面的代码作为 then 里面的第二个参数而已。
|
|
|
|
|
|
|
|
|
|
### 不处理 reject() 异常,会怎么样?
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Promise 规范
|
|
|
|
|
|
|
|
|
|
Promise 是⼀个拥有 then ⽅法的对象或函数。任何符合 promise 规范的对象或函数都可以成为 Promise。
|
|
|
|
|
|
|
|
|
|
关于 promise 规范的详细解读,可以看下面这个链接:
|
|
|
|
|
|
|
|
|
|
- Promises/A+ 规范:<https://promisesaplus.com/>
|
|
|
|
|
|