在 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()
)则为常见的异步操作模式提供了方便的接口。掌握这些方法将帮助我们编写更高效、清晰和可维护的异步代码。