深入理解 JavaScript 的 Promise:实例方法与静态方法
在 JavaScript 中,Promise
是处理异步操作的核心工具,它提供了方便的接口来管理异步任务的执行顺序。本文将介绍 Promise
的实例方法和静态方法,帮助你更好地理解和使用它。
一、Promise
的实例方法
Promise
的实例方法主要用于处理单个 Promise
实例的结果。这些方法帮助你在 Promise
完成后做进一步的操作。
1. then()
then()
方法是 Promise
的核心方法之一,它接受两个参数:一个用于处理成功结果的回调函数,一个用于处理错误的回调函数。then()
返回一个新的 Promise
,因此可以链式调用。
let promise = new Promise((resolve, reject) => {
let success = true;
if (success) {
resolve("Operation successful");
} else {
reject("Operation failed");
}
});
promise
.then(result => {
console.log(result); // "Operation successful"
})
.catch(error => {
console.log(error); // 不会执行
});
2. catch()
catch()
方法用于捕获 Promise
中发生的任何错误,它的作用相当于 .then(null, errorHandler)
。catch()
方法也会返回一个新的 Promise
,可以继续链式调用。
let promise = new Promise((resolve, reject) => {
reject("An error occurred");
});
promise
.catch(error => {
console.log(error); // "An error occurred"
});
3. finally()
finally()
方法在 Promise
完成时无论成功或失败都会执行。它通常用于清理操作,比如关闭加载指示器或重置状态。finally()
不会影响 Promise
的状态,且返回的 Promise
与原 Promise
的结果一致。
let promise = new Promise((resolve, reject) => {
resolve("Operation complete");
});
promise
.finally(() => {
console.log("Cleanup actions here");
})
.then(result => {
console.log(result); // "Operation complete"
});
二、Promise
的静态方法
除了实例方法,Promise
还提供了许多静态方法,这些方法帮助你执行一些常见的异步操作模式。
1. Promise.resolve()
Promise.resolve()
方法用于返回一个已解决的 Promise
对象。如果传入一个值,它会被自动包裹成一个 Promise
;如果传入的是一个已有的 Promise
,则会直接返回它。
let resolvedPromise = Promise.resolve(42);
resolvedPromise.then(value => {
console.log(value); // 42
});
2. Promise.reject()
Promise.reject()
方法用于返回一个已拒绝的 Promise
对象,通常用于创建一个失败的 Promise
。
let rejectedPromise = Promise.reject("Something went wrong");
rejectedPromise.catch(error => {
console.log(error); // "Something went wrong"
});
3. Promise.all()
Promise.all()
方法接受一个包含多个 Promise
的数组,并返回一个新的 Promise
,该 Promise
在所有输入的 Promise
都成功时被解决,并返回一个包含所有成功结果的数组。如果其中任何一个 Promise
被拒绝,Promise.all()
返回的 Promise
会立即被拒绝。
let promise1 = Promise.resolve(1);
let promise2 = Promise.resolve(2);
let promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3]).then(values => {
console.log(values); // [1, 2, 3]
});
如果其中一个 Promise
失败,Promise.all()
会立即拒绝:
let promise1 = Promise.resolve(1);
let promise2 = Promise.reject("Error occurred");
let promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values);
})
.catch(error => {
console.log(error); // "Error occurred"
});
4. Promise.allSettled()
Promise.allSettled()
方法也接受一个包含多个 Promise
的数组,但与 Promise.all()
不同,它会等待所有的 Promise
完成,无论是成功还是失败。它返回一个包含每个 Promise
状态(成功或失败)和对应值(或错误)的数组。
let promise1 = Promise.resolve(1);
let promise2 = Promise.reject("Error occurred");
let promise3 = Promise.resolve(3);
Promise.allSettled([promise1, promise2, promise3]).then(results => {
console.log(results);
// [
// { status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: 'Error occurred' },
// { status: 'fulfilled', value: 3 }
// ]
});
5. Promise.race()
Promise.race()
方法接受一个包含多个 Promise
的数组,返回一个新的 Promise
,它会在第一个 Promise
完成时返回。无论该 Promise
是成功还是失败,Promise.race()
都会立即返回该结果。
let promise1 = new Promise(resolve => setTimeout(resolve, 100, "First"));
let promise2 = new Promise(resolve => setTimeout(resolve, 200, "Second"));
Promise.race([promise1, promise2]).then(result => {
console.log(result); // "First"
});
6. Promise.any()
Promise.any()
方法与 Promise.race()
类似,唯一的不同是,它只会在至少一个 Promise
成功时返回。如果所有的 Promise
都失败,Promise.any()
会返回一个失败的 Promise
。
let promise1 = new Promise((_, reject) => setTimeout(reject, 100, "Error"));
let promise2 = new Promise(resolve => setTimeout(resolve, 200, "Success"));
Promise.any([promise1, promise2]).then(result => {
console.log(result); // "Success"
}).catch(error => {
console.log(error); // 如果所有 Promise 都失败,输出错误
});
三、总结
在 JavaScript 中,Promise
的实例方法和静态方法提供了强大的工具来管理异步任务。实例方法(如 then()
、catch()
、finally()
)允许我们对单个 Promise
实例的结果进行操作,而静态方法(如 Promise.resolve()
、Promise.all()
、Promise.race()
)则为常见的异步操作模式提供了方便的接口。掌握这些方法将帮助我们编写更高效、清晰和可维护的异步代码。