Promise 是 JavaScript 中一种用于处理异步操作的对象,它可以让我们更优雅地处理异步代码,并解决了回调地狱(callback hell)的问题。Promise 是一个代表了异步操作最终完成或失败的对象,并可以获取异步操作的结果。
Promise 的原理是基于状态(state)和回调函数(callback)的机制:
-
状态:Promise 有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。初始状态是 pending,当异步操作完成后,可以变为 fulfilled(成功)或 rejected(失败),一旦状态发生变化,就不可再改变。
-
回调函数:Promise 实例有两个回调函数:成功时的回调函数
then
和失败时的回调函数catch
。当异步操作成功时,会调用then
方法指定的回调函数,传递成功的结果;当异步操作失败时,会调用catch
方法指定的回调函数,传递失败的原因。
下面是一个简单的 Promise 示例:
// 异步操作函数
function asyncOperation() {
return new Promise((resolve, reject) => {
// 模拟异步操作
setTimeout(() => {
const random = Math.random();
if (random < 0.5) {
resolve("Success: " + random);
} else {
reject("Error: " + random);
}
}, 1000);
});
}
// 调用异步操作函数
asyncOperation()
.then((result) => {
console.log(result); // 输出成功结果
})
.catch((error) => {
console.error(error); // 输出失败原因
});
在这个示例中,asyncOperation
函数返回一个 Promise 对象,当异步操作完成后,根据结果调用 resolve
或 reject
。然后我们通过 then
方法来处理成功的结果,通过 catch
方法来处理失败的原因。
Promise 的应用包括但不限于:
- 异步操作:Promise 可以处理异步代码,让代码更具可读性和可维护性。
- 多个异步操作的并行执行和串行执行:通过 Promise 的链式调用和
Promise.all
、Promise.race
方法可以实现多个异步操作的并行执行或串行执行。 - 解决回调地狱:Promise 可以避免回调地狱,使代码结构更清晰、简洁。
- 资源加载和错误处理:Promise 可以用于异步加载资源(例如图片、脚本等)以及错误处理。
Promise 对象有一些常用的静态方法,可以用于处理多个 Promise 实例,或者用于生成新的 Promise 实例。以下是一些常用的 Promise 静态方法:
1. Promise.all(iterable)
Promise.all
方法接收一个可迭代的对象(通常是一个数组),并返回一个新的 Promise 实例。该 Promise 实例在可迭代对象中所有的 Promise 实例都已解析(resolved)或其中任何一个 Promise 实例被拒绝(rejected)时才会解析或拒绝。
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // 输出:[1, 2, 3]
});
2. Promise.race(iterable)
Promise.race
方法同样接收一个可迭代的对象,并返回一个新的 Promise 实例。该 Promise 实例解析或拒绝,取决于可迭代对象中第一个解析或拒绝的 Promise 实例。
const promise1 = new Promise(resolve => setTimeout(resolve, 100, 'one'));
const promise2 = new Promise(resolve => setTimeout(resolve, 200, 'two'));
Promise.race([promise1, promise2])
.then(value => {
console.log(value); // 输出:'one'
});
3. Promise.resolve(value)
Promise.resolve
方法返回一个已解析的 Promise 实例,根据提供的值。如果提供的值是一个 Promise,则返回该 Promise 实例;如果提供的是一个 thenable 对象(拥有 then 方法的对象),则返回一个新的 Promise 实例,该实例的状态会根据 thenable 对象的状态而变化;其他情况下,返回一个以提供的值解析为成功状态的 Promise 实例。
const promise = Promise.resolve('Success');
promise.then(value => {
console.log(value); // 输出:'Success'
});