【笔记】JS的Promise承诺
前言
JS的Promise承诺学习笔记
Promise对象
- 创建Promise对象时,需要传入一个回调函数,这个回调函数被称为执行器函数(executor),执行器函数会立即执行,并传入两个形参,这两个形参是两个回调函数,分别表示决议(
resolve)回调和拒绝(reject)回调 - 一旦Promise对象的状态从进行中(pending)变为已兑现(fulfilled)或从进行中(pending)变为已拒绝(rejected)时,这个Promise对象的状态不会再次改变
- 当执行器函数中还没有调用
resolve()或reject()时,则Promise对象的状态为进行中(pending) - 当执行器函数中调用
resolve()时- 如果
resolve()没有传递任何参数,则Promise对象的状态变成已兑现(fulfilled) - 如果
resolve()传入的参数是非thenable对象(一个没有then方法的对象)或普通值,则Promise对象的状态立即变成已兑现(fulfilled) - 如果
resolve()传入的参数是thenable对象(一个有then方法的对象),则Promise对象的状态由这个对象的then方法的返回值决定 - 如果
resolve()传入的参数是另一个Promise对象,则Promise对象状态由另一个Promise对象的执行器函数的返回值决定
- 如果
- 当执行器函数中调用
reject()时,则Promise对象的状态立即变为已拒绝(rejected) - 当执行器函数中抛出异常,则Promise对象的状态立即变为已拒绝(rejected)
- 如果Promise对象的状态为已兑现(fulfilled),则立即执行
then()中的回调函数;如果Promise对象的状态为已拒绝(rejected),则立即执行catch()中的回调函数
创建Promise对象
创建Promise对象并兑现
1 | const promise = new Promise((resolve, reject) => { |
创建Promise对象并拒绝
1 | const promise = new Promise((resolve, reject) => { |
创建Promise对象并决议
1 | const promise = new Promise((resolve, reject) => { |
执行器函数中的决议
立即兑现
调用resolve()
1 | const promise = new Promise((resolve, reject) => { |
返回普通值
1 | const promise = new Promise((resolve, reject) => { |
返回非thenable对象
1 | const promise = new Promise((resolve, reject) => { |
由thenable对象进行决议
1 | const promise = new Promise((resolve, reject) => { |
由新Promise对象进行决议
1 | const promise = new Promise((resolve, reject) => { |
立即拒绝
调用reject()
1 | const promise = new Promise((resolve, reject) => { |
抛出异常
1 | const promise = new Promise((resolve, reject) => { |
由thenable对象进行拒绝
1 | const promise = new Promise((resolve, reject) => { |
由新Promise对象进行拒绝
1 | const promise = new Promise((resolve, reject) => { |
监听Promise对象回调
监听Promise对象的兑现
1 | promise.then((value) => { |
监听Promise对象的拒绝
1 | promise.catch((err) => { |
监听Promise对象的决议
- 即便只有拒绝,也要同时定义then函数和catch函数,否则会报错:
Uncaught (in promise) Error: xxx
1 | promise.then((value) => { |
- 链式调用
1 | promise.then((value) => { |
同一个Promise的多个监听
监听Promise对象的兑现
1 | promise.then((value) => { |
监听Promise对象的拒绝
1 | promise.catch((err) => { |
最终
- 无论Promise对象的状态变为已兑现(fulfilled)还是已拒绝(rejected),如果定义了finally函数,都会执行finally函数定义的回调函数
- finally函数定义的回调函数不会接收任何参数
1 | promise.finally(() => { |
链式调用
- 由于
then()返回的是一个新Promise对象,新Promise对象的状态由then()的回调函数返回值决定,并可以继续链式调用then() - 当
then()中的回调函数还没有return时,则Promise对象的状态为进行中(pending) - 当
then()中的回调函数return时- 如果返回值是非thenable对象(一个没有then方法的对象)或普通值,则新Promise对象的状态立即变成已兑现(fulfilled)
- 如果返回值是thenable对象(一个有then方法的对象),则新Promise对象的状态由这个对象的then方法的返回值决定
- 如果返回值是另一个Promise对象,则新Promise对象状态由另一个Promise对象的执行器函数的返回值决定
- 当
then()中的回调函数抛出异常,则新Promise对象的状态立即变为已拒绝(rejected)
1 | const promise = new Promise((resolve, reject) => {resolve("value")}).then((value) => { |
执行器函数中的决议
立即兑现
返回普通值
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
返回非thenable对象
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
由thenable对象进行决议
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
由新Promise对象进行决议
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
立即拒绝
抛出异常
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
由thenable对象进行拒绝
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
由新Promise对象进行拒绝
1 | const promise = new Promise((resolve, reject) => {}).then((value) => { |
监听then函数的回调
监听then函数的兑现
1 | promise.then((value) => {}).then((value) => { |
监听then函数的拒绝
1 | promise.then((value) => {}).catch((err) => { |
监听then函数的决议
1 | promise.then((value) => {}).then((value) => { |
监听catch函数的回调
监听then函数的兑现
1 | promise.catch((err) => {}).then((value) => { |
监听then函数的拒绝
1 | promise.catch((err) => {}).catch((err) => { |
监听then函数的决议
1 | promise.catch((err) => {}).then((value) => { |
多级链式调用
多级链式调用的兑现
- 链式调用时,只要Promise对象的状态变为已兑现(fulfilled),则立即寻找最近的then函数进行回调
1 | const promise = new Promise((resolve, reject) => { |
多级链式调用的拒绝
- 链式调用时,只要Promise对象的状态变为已拒绝(rejected),则立即寻找最近的catch函数进行回调
1 | const promise = new Promise((resolve, reject) => { |
类方法
resolve
- 直接定义状态为已兑现(fulfilled)的Promise对象
1 | const promise = Promise.resolve("value"); |
1 | const promise = new Promise((resolve) => { |
reject
- 直接定义状态为已拒绝(rejected)的Promise对象
1 | const promise = Promise.reject("value"); |
1 | const promise = new Promise((_, reject) => { |
all
将多个Promise对象包裹在一起形成一个新的Promise,新的Promise对象的状态由包裹的所有Promise对象共同决定
获取所有已成功的值
- 当所有的Promise对象的状态都变为已兑现(fulfilled),则新Promise对象的状态变为已兑现(fulfilled),并将所有Promise对象返回值以数组的形式作为then函数的参数
1 | const promise1 = new Promise((resolve, reject) => {resolve("value1")}); |
- 当有一个Promise对象的状态变为已拒绝(rejected),则新Promise对象的状态立即变为已拒绝(rejected),且立即终止执行其他Promise对象的执行器函数,并将第一个已拒绝(rejected)的返回值作为catch函数的参数
1 | const promise1 = new Promise((resolve, reject) => {reject("err1")}); |
allSettled
将多个Promise对象包裹在一起形成一个新的Promise,新的Promise对象状态由包裹的所有Promise对象共同决定
获取所有值,不论是否已成功
- 不论任何一个Promise对象的状态变为已兑现(fulfilled)还是已拒绝(rejected),都会继续执行完所有其他Promise对象的执行器函数
- 新Promise对象的状态最终一定会变为已兑现(fulfilled)
- 所有执行器函数都执行完成后,将所有结果以数组的形式作为then函数的参数
1 | const promise1 = new Promise((resolve, reject) => {resolve("value")}); |
any
将多个Promise对象包裹在一起形成一个新的Promise,新的Promise对象状态由包裹的所有Promise对象共同决定
获取第一个已成功的值
- 当有一个Promise对象的状态变为已兑现(fulfilled),则新Promise对象状态变为已兑现(fulfilled),并立即终止所有所有其他Promise对象的执行器函数
1 | const promise1 = new Promise((resolve, reject) => {resolve("value1")}); |
- 当有Promise对象的状态变为已拒绝(rejected),继续寻找状态变为已兑现(fulfilled)的Promise对象
- 当所有Promise对象的状态都变为已拒绝(rejected),则新Promise对象状态变为已拒绝(rejected)
1 | const promise1 = new Promise((resolve, reject) => {reject("err1")}); |
rase
将多个Promise对象包裹在一起形成一个新的Promise,新的Promise对象状态由包裹的所有Promise对象共同决定
获取第一个值,不论是否已成功
- 不论任何一个Promise对象的状态变为已兑现(fulfilled)还是已拒绝(rejected),则新Promise对象的状态立即跟随改变,并立即终止所有所有其他Promise对象的执行器函数
1 | const promise1 = new Promise((resolve, reject) => {resolve("value")}); |