From 83891011d0869cb6ca885d2c0fbb215ae60c9a78 Mon Sep 17 00:00:00 2001 From: qianguyihao Date: Sun, 23 May 2021 18:51:05 +0800 Subject: [PATCH] =?UTF-8?q?update:=20Promise=E7=9A=84=E9=9D=99=E6=80=81?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10-Promise入门详解.md | 61 +++++++++- .../11-Promise的链式调用.md | 12 +- ...e的常见用法和API.md => 12-Promise的静态方法.md} | 105 +++--------------- 3 files changed, 79 insertions(+), 99 deletions(-) rename 06-JavaScript基础:ES6语法/{12-Promise的常见用法和API.md => 12-Promise的静态方法.md} (50%) diff --git a/06-JavaScript基础:ES6语法/10-Promise入门详解.md b/06-JavaScript基础:ES6语法/10-Promise入门详解.md index 72373f1..de4ee9a 100644 --- a/06-JavaScript基础:ES6语法/10-Promise入门详解.md +++ b/06-JavaScript基础:ES6语法/10-Promise入门详解.md @@ -448,7 +448,15 @@ promiseB ## 处理 reject 失败状态的两种写法 -我们有两种写法可以捕获并处理 reject 异常状态。这两种写法的代码举例如下: +我们有两种写法可以捕获并处理 reject 异常状态: + +- 写法 1:通过 catch 方法捕获 状态变为已 reject 时的 promise + +- 写法 2:then 可以传两个参数,第⼀个参数为 resolve 后执⾏,第⼆个参数为 reject 后执⾏。 + +### 代码格式 + +这两种写法的**代码格式**如下: ```js // 第一步:model层的接口封装 @@ -498,6 +506,57 @@ try-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 里面的第二个参数而已。 + ## 总结 了解这些内容之后, 你已经对 Promise 有了基本了解。下一篇文章,我们来讲一讲 Promise 在实战开发的常见用法。 diff --git a/06-JavaScript基础:ES6语法/11-Promise的链式调用.md b/06-JavaScript基础:ES6语法/11-Promise的链式调用.md index 3da3937..52e05b2 100644 --- a/06-JavaScript基础:ES6语法/11-Promise的链式调用.md +++ b/06-JavaScript基础:ES6语法/11-Promise的链式调用.md @@ -99,7 +99,7 @@ new Promise((resolve, reject) => { 怎么个封装法呢?上面的代码中,每次在 return 一个 promise 的时候,只是 url 地址不一样,其他的代码是一样的。所以我们可以把重复的代码封装成函数。写法如下。 -### Promise 链式调用(封装写法) +### Promise 链式调用(封装一个接口) 针对同一个接口的多次嵌套调用,采用 promise 封装后的写法如下: @@ -162,7 +162,7 @@ getPromise('a.json') 但是,真正在实战中,我们往往需要嵌套请求**多个不同的接口**,要处理的 resolve 和 reject 的时机往往是不同的,所以需要分开封装不同的 Promise 实例,这在实战开发中更为常见。代码应该是像下面这样写。 -### Promise 链式调用(封装写法,多个接口) +### Promise 链式调用(封装多个接口) 针对多个不同接口的嵌套调用,采用 promise 封装后的写法如下: @@ -322,7 +322,7 @@ getPromise('a.json') ### 统一处理 reject -针对 a、b、c 这三个请求,不管哪个请求失败,我就希望做统一处理。这种代码要怎么写呢?我们可以在最后面写一个 catch。 +针对 a、b、c 这三个请求,不管哪个请求失败,我都希望做统一处理。这种代码要怎么写呢?我们可以在最后面写一个 catch。 代码举例如下: @@ -347,11 +347,11 @@ getPromise('a.json') }); ``` -上面的代码中,由于是统一处理多个请求的异常,所以只要有一个请求失败了,就会马上走到 catch,剩下的请求就不会继续执行了。比如说: +上面的代码中,由于是统一处理多个请求的异常,所以**只要有一个请求失败了,就会马上走到 catch**,剩下的请求就不会继续执行了。比如说: -- a 请求失败:走到 catch,不执行 b 和 c +- a 请求失败:然后会走到 catch,不执行 b 和 c -- a 请求成功,b 请求失败:走到 catch,不执行 c。 +- a 请求成功,b 请求失败:然后会走到 catch,不执行 c。 ## return 的返回值 diff --git a/06-JavaScript基础:ES6语法/12-Promise的常见用法和API.md b/06-JavaScript基础:ES6语法/12-Promise的静态方法.md similarity index 50% rename from 06-JavaScript基础:ES6语法/12-Promise的常见用法和API.md rename to 06-JavaScript基础:ES6语法/12-Promise的静态方法.md index 7d821f8..904cbf6 100644 --- a/06-JavaScript基础:ES6语法/12-Promise的常见用法和API.md +++ b/06-JavaScript基础:ES6语法/12-Promise的静态方法.md @@ -1,9 +1,11 @@ +## Promise 的常用API分类 +### Promise的实例方法 -## Promise 的常用 API:实例方法【重要】 +**实例方法**:我们需要先 new 一个 promise实例对象,然后通过 promise对象去调用 `then`、`catch`、`finally`方法。这几个方法就是 Promise 的实例方法。 -Promise 自带的 API 提供了如下实例方法: +具体来说,Promise 的自带API 提供了如下实例方法: - promise.then():获取异步任务的正常结果。 @@ -11,103 +13,22 @@ Promise 自带的 API 提供了如下实例方法: - promise.finaly():异步任务无论成功与否,都会执行。 -代码举例如下。 -写法 1: +### Promise的静态方法 -```html - - - - - - Document - - - - - -``` +具体来说,Promise 的自带API 提供了如下静态方法: -写法 2:(和上面的写法 1 等价) +- `Promise.resolve()` -```html - - - - - - Document - - - - - -``` +- `Promsie.all()` -**注意**:写法 1 和写法 2 的作用是完全等价的。只不过,写法 2 是把 catch 里面的代码作为 then 里面的第二个参数而已。 +- `Promise.race` + +前面的几篇文章,讲的都是 Promise的**实例方法**;今天这篇文章,我们来详细讲一下 Promise的**静态方法**。 ## Promise 的常用 API:对象方法【重要】