Promise基础
JavaScript 的 Promise
是一种处理异步操作的机制,能够让代码在处理异步任务时更具可读性和可维护性。Promise
对象代表一个异步操作的最终完成(或失败)及其结果值。以下是对 Promise
的详细解释:
基础概念
-
Promise 状态
- Pending(待定): 初始状态,既不是成功也不是失败。
- Fulfilled(已兑现): 操作成功完成,结果值是
promise
被解决的值。 - Rejected(已拒绝): 操作失败,原因是
promise
被拒绝的原因。
-
Promise 对象的三种状态:
- 一个
Promise
对象在其生命周期内只能处于上述三种状态中的一种,且状态一旦改变就不可再改变。
- 一个
创建 Promise
使用 Promise
构造函数可以创建一个新的 Promise
实例。构造函数接受一个执行函数作为参数,这个执行函数有两个参数:resolve
和 reject
。
const myPromise = new Promise((resolve, reject) => {
// 异步操作
const success = true;
if (success) {
resolve('操作成功');
} else {
reject('操作失败');
}
});
使用 Promise
Promise
对象提供了两个主要的方法来处理结果:then
和 catch
。
then(onFulfilled, onRejected)
:onFulfilled
是一个函数,它会在Promise
成功时被调用,并接收resolve
的值。onRejected
是一个函数,它会在Promise
失败时被调用,并接收reject
的值。
myPromise
.then(result => {
console.log(result); // 输出: 操作成功
})
.catch(error => {
console.log(error); // 输出: 操作失败
});
catch(onRejected)
: 处理Promise
的拒绝状态。它等同于then(null, onRejected)
。
myPromise
.catch(error => {
console.log(error); // 输出: 操作失败
});
finally(onFinally)
: 不管Promise
是成功还是失败,都会执行onFinally
回调。常用于清理操作。
myPromise
.finally(() => {
console.log('Promise 完成');
});
链式调用
Promise
支持链式调用。这意味着你可以在一个 Promise
完成后继续链式调用 then
和 catch
。
myPromise
.then(result => {
console.log(result); // 操作成功
return result + ' - 继续处理';
})
.then(newResult => {
console.log(newResult); // 操作成功 - 继续处理
})
.catch(error => {
console.log(error);
});
处理多个 Promise
Promise.all(iterable)
: 等待所有Promise
完成并返回一个新的Promise
,这个Promise
会在所有输入的Promise
都成功时成功,并返回所有Promise
成功结果的数组。如果有任何一个Promise
失败,则返回的Promise
也会失败。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // [3, 42, 'foo']
});
Promise.race(iterable)
: 返回一个新的Promise
,一旦迭代中的Promise
有一 个成功或失败,它就会返回该Promise
的结果值。
const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'one'));
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'two'));
Promise.race([promise1, promise2])
.then(value => {
console.log(value); // 'two'
});
Promise.allSettled(iterable)
: 等待所有Promise
都完成,不管是成功还是失败,并返回一个新的Promise
,该Promise
在所有输入的Promise
都完成后成功,返回所有输入Promise
结果的数组,每个结果都是一个对象,包含status
和value
或reason
。
const promise1 = Promise.resolve(3);
const promise2 = Promise.reject('error');
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
results.forEach((result) => {
if (result.status === 'fulfilled') {
console.log('成功:', result.value);
} else {
console.log('失败:', result.reason);
}
});
});
Promise.any(iterable)
: 返回一个新的Promise
,一旦迭代中的任何一个Promise
成功,返回的Promise
就会成功。所有Promise
都失败时,返回的Promise
会失败。
const promise1 = Promise.reject('error1');
const promise2 = Promise.reject('error2');
const promise3 = Promise.resolve('success');
Promise.any([promise1, promise2, promise3])
.then(value => {
console.log(value); // 'success'
});
总结
Promise
是一种强大的工具,能够让你更好地管理异步操作和处理链式调用。它帮助你避免了回调地狱(callback hell),使得异步代码更为简洁和易于理解。