1、Promise的基本概念
1.1、基本概念:
Promise
是JavaScript
中的一种用于处理异步操作的对象
。- 可以把它想象成一个“承诺”——程序承诺会在未来的某个时间点完成某件事(比如从服务器获取数据),但是,并不立即返回结果。
1.2、Promise的状态:
Promise 有三种状态:
Pending(进行中)
: 承诺还没有完成,也没有失败,它正在等待某件事情发生。Fulfilled(已完成)
: 承诺成功地完成了,并且返回了一个结果。Rejected(已失败)
: 承诺未能完成,发生了某种错误或问题。
1.3、生活场景示例:
假设小明让小红帮忙买咖啡,小红答应了,这时,这个“答应”的过程就是一个
Promise
,它可能有三种状态:
- Pending:小红还在咖啡店排队,咖啡还没买到手。
- Fulfilled:小红已经买到咖啡,并且把咖啡给了小明。
- Rejected:小红因为某种原因没法买到咖啡,告诉小明:“抱歉,没买到”。
2、Promise的链式调用规则
Promise的
链式调用
是指:
- 在一个
Promise
的.then() 方法
中返回一个新的Promise,然后可以继续在这个新的Promise上调用.then() 方法
。- 这种方式可以:让我们可以把多个异步操作串联起来,依次处理,避免回调地狱。
.then()
返回的是一个新的Promise
:- 每次调用
.then() 方法
后,你都会得到一个新的Promise
。 - 这使得你可以在下一个
.then()
里继续处理上一个.then()
的结果。
- 每次调用
.then() 的回调函数
可以返回值:- 如果
回调函数
返回的是一个普通的值(而不是 Promise),这个值会被包装成一个已经完成的 Promise,并传递给下一个.then()
。
- 如果
- 回调函数返回的是
Promise
:- 如果回调函数返回的是一个
Promise
,那么下一个.then()
将会等待这个Promise
完成,然后继续处理结果。
- 如果回调函数返回的是一个
错误传递
:- 如果任何一个
.then()
中发生错误(包括抛出异常或返回一个被拒绝的 Promise),这个错误会被传递到后面最近的.catch()
中处理。
- 如果任何一个
3、Promise的静态方法
Promise.resolve(value)
:- 用来快速创建一个已经完成的
Promise
,并将给定的value
作为结果。 - 适用于:将一个普通的值或非Promise的结果
转换为Promise
- 用来快速创建一个已经完成的
Promise.reject(reason)
:- 用来快速创建一个被拒绝的Promise,并将给定的 reason 作为错误原因。
- 适用于:将一个错误或失败的结果转换为 Promise
Promise.all(iterable)
:- 接受一个可迭代对象(通常是一个数组)作为参数,其中每个元素都是一个 Promise。
- 只有当所有的 Promise 都完成时,返回的 Promise 才会被完成,结果是一个包含所有结果的数组
- 如果有任何一个Promise被拒绝,Promise.all会立即返回一个被拒绝的Promise
Promise.race(iterable)
:- 接受一个可迭代对象,其中每个元素也是一个 Promise。
- 返回的 Promise 会在第一个 Promise 完成或拒绝时,采用这个 Promise 的结果或错误。
- 适用于:你只关心最先完成的异步操作的场景
Promise.allSettled(iterable)
:- 接受一个可迭代对象,每个元素是一个 Promise。
- 返回的 Promise 会等待所有的 Promise 都结束(无论是完成还是拒绝),并返回一个数组,数组中的每一项都是一个对象,表示每个 Promise 的状态和结果。
- 适用于:你希望等待所有 Promise 结束后,处理每个 Promise 的结果
Promise.any(iterable)
:- 接受一个可迭代对象,每个元素是一个 Promise。
- 返回的 Promise 会在第一个成功(fulfilled)的 Promise 完成时被完成。如果所有的 Promise 都被拒绝,返回的 Promise 会被拒绝,错误信息是所有错误的一个数组。
- 适用于:你只关心最先成功的异步操作的场景
4、async和await
async
和await
是JavaScript
中用于处理异步操作的关键字
。- 它们让你能够像写同步代码那样编写异步代码