Promise简介
Promise(承诺)是JavaScript
中的一种异步编程解决方案,用于处理异步操作和避免回调地狱。
它可以将异步操作封装成一个对象,通过链式调用来处理异步任务的完成状态(已完成、未完成、已失败)。
Promise有三种状态:
- pending(进行中)
- fulfilled(已完成)
- ejected(已失败)
一旦Promise的状态发生改变,就无法再次变化。
创建Promise对象的方式是使用new关键字调用Promise构造函数,构造函数接受一个执行器函数作为参数。执行器函数会立即执行,并且接受两个参数:resolve
和reject
。在执行器函数中,我们可以执行异步操作,并根据操作的结果调用resolve或reject函数来改变Promise的状态。
下面是一个简单的例子,展示了如何创建和使用Promise:
const myPromise = new Promise((resolve, reject) => { // 异步操作,比如发送网络请求等 const success = true; // 假设请求成功 if (success) { resolve("请求成功"); // 改变Promise状态为fulfilled,并传递一个值给后续的then方法 } else { reject("请求失败"); // 改变Promise状态为rejected,并传递一个错误信息给后续的catch方法 } }); myPromise.then((result) => { console.log(result); // 请求成功时的处理逻辑 }).catch((error) => { console.error(error); // 请求失败时的处理逻辑 });
在上面的代码中,myPromise
表示一个异步操作,如果成功,调用resolve
函数并传递结果;如果失败,调用reject
函数并传递错误信息。然后可以通过调用then
方法来处理操作成功的情况,或者通过调用catch
方法来处理操作失败的情况。
除了then
和catch
方法外,Promise还提供了其他一些方法,如finally
、all
和race
等,用于更复杂的异步操作的处理。
总结起来,Promise是一种用于处理异步操作的对象,它将异步操作封装成一个可以链式调用的对象,并提供了丰富的方法来处理操作的结果。通过使用Promise,可以更加清晰和简洁地编写异步代码。
Promise实例方法
Promise实例具有以下几个常用的方法:
1. then(onFulfilled
, onRejected
)
- 该方法用于注册处理
Promise
对象状态变为fulfilled
(已完成)时的回调函数onFulfilled
,以及状态变为rejected(已失败)时的回调函数onRejected
。 - 返回一个新的
Promise
对象,可以通过链式调用来处理异步操作的完成状态。
2. catch(onRejected
)
- 该方法用于注册处理Promise对象状态变为
rejected
(已失败)时的回调函数onRejected。 - 返回一个新的
Promise
对象,可以通过链式调用来处理异步操作的完成状态。
3. finally(onFinally
)
- 该方法用于注册无论
Promise
对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数onFinally。 - 返回一个新的
Promise
对象,可以通过链式调用来处理异步操作的完成状态。
4. Promise.resolve(value
)
- 该方法返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。
5. Promise.reject(reason
)
- 该方法返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。
6. Promise.all(iterable
)
- 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
- 当可迭代对象中的所有Promise对象都变为fulfilled(已完成)状态时,返回的Promise对象状态也会变为fulfilled,并返回一个由每个Promise对象值组成的数组。
- 如果可迭代对象中的任意一个Promise对象变为rejected(已失败)状态,则返回的Promise对象状态会立即变为rejected,并传递第一个被拒绝的Promise的原因。
7. Promise.race(iterable
)
- 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
- 当可迭代对象中的任意一个Promise对象的状态发生改变时(无论是fulfilled还是rejected),返回的Promise对象的状态也会相应地发生改变,且与第一个发生改变的Promise对象保持一致。
这些方法提供了灵活的处理异步操作的方式,可以根据需要进行链式调用、捕获错误、执行最终的清理操作等。
Promise实例方法
Promise原型(prototype)上有以下几个常用的方法:
1. prototype.then(onFulfilled
, onRejected
)
- 该方法用于注册处理Promise对象状态变为fulfilled(已完成)时的回调函数
onFulfilled
,以及状态变为rejected(已失败)时的回调函数onRejected
。 - 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。
2. prototype.catch(onRejected
)
- 该方法用于注册处理Promise对象状态变为rejected(已失败)时的回调函数
onRejected
。 - 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。
3. prototype.finally(onFinally
)
- 该方法用于注册无论Promise对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数
onFinally
。 - 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。
这些原型方法与实例方法具有相同的功能,可以在Promise实例上直接调用。它们提供了处理异步操作的灵活方式,可以根据需要注册不同的回调函数,处理成功和失败的情况,并在最终完成时执行清理操作。
同时,在原型上还有其他一些方法,例如:
- prototype.resolve(value): 返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。
- prototype.reject(reason): 返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。
- prototype.all(iterable): 静态方法Promise.all()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。
- prototype.race(iterable): 静态方法Promise.race()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。
这些原型方法使得我们可以直接在Promise构造函数的原型上调用相应的方法,而不需要创建实例来使用它们。
Promise原型方法和实例方法的对比
以下是Promise原型方法和实例方法的对比总结表格:
方法 | 作用 | 在原型上调用 | 在实例上调用 |
then | 注册处理Promise对象状态变为fulfilled时的回调函数以及状态变为rejected时的回调函数 | Promise.prototype.then() | promiseInstance.then() |
catch | 注册处理Promise对象状态变为rejected时的回调函数 | Promise.prototype.catch() | promiseInstance.catch() |
finally | 注册无论Promise对象的状态是fulfilled还是rejected时都会执行的回调函数 | Promise.prototype.finally() | promiseInstance.finally() |
resolve | 返回一个状态为fulfilled且值为传入value的Promise对象 | Promise.resolve() | 不适用 |
reject | 返回一个状态为rejected且原因为传入reason的Promise对象 | Promise.reject() | 不适用 |
all | 接受一个可迭代对象,当所有Promise对象都为fulfilled状态时返回一个由每个Promise值组成的数组 | Promise.all() | 不适用 |
race | 接受一个可迭代对象,返回第一个变为fulfilled或rejected状态的Promise对象的结果 | Promise.race() | 不适用 |
其他非实例特有方法 | resolve, reject, all, race等方法在原型上实现,用于直接在原型上调用,不需要创建Promise实例 | Promise.resolve(), Promise.reject(), 等等 | 不适用 |
需要注意的是,原型方法可以直接在Promise构造函数的原型上调用,而实例方法需要在具体的Promise实例上调用。另外,resolve
、reject
、all
、race
等方法是非实例特有的静态方法,用于直接在原型上调用,而不需要创建Promise实例。
这些方法提供了灵活的处理异步操作的方式,并且可通过链式调用来处理多个异步操作的完成状态。