Promise
是 JavaScript 中处理异步操作的一种强大机制。它提供了一种更清晰、更可控的方式来处理异步代码,避免了回调地狱(callback hell)和复杂的错误处理。
基本概念
-
状态:
- Pending:初始状态,既不是成功也不是失败。
- Fulfilled:操作成功完成。
- Rejected:操作失败。
-
方法:
then
:处理 fulfilled 状态。catch
:处理 rejected 状态。finally
:无论成功还是失败都会执行。
创建 Promise
你可以使用 new Promise
构造函数来创建一个 Promise 对象:
javascript
const myPromise = new Promise((resolve, reject) => {
// 异步操作
setTimeout(() => {
const success = Math.random() > 0.5;
if (success) {
resolve('Operation succeeded');
} else {
reject(new Error('Operation failed'));
}
}, 1000);
});
处理 Promise
你可以使用 .then
和 .catch
方法来处理 Promise 的结果:
javascript
myPromise
.then(result => {
console.log('Success:', result);
})
.catch(error => {
console.error('Error:', error.message);
});
链式调用
Promise 支持链式调用,可以依次处理多个异步操作:
javascript
myPromise
.then(result => {
console.log('First success:', result);
return 'Second operation';
})
.then(secondResult => {
console.log('Second success:', secondResult);
})
.catch(error => {
console.error('Error:', error.message);
});
使用 async/await
async/await
是处理 Promise 的语法糖,使异步代码看起来像同步代码:
javascript
async function handleMyPromise() {
try {
const result = await myPromise;
console.log('Success:', result);
} catch (error) {
console.error('Error:', error.message);
}
}
handleMyPromise();
常见的 Promise 方法
Promise.all
:等待所有 Promise 完成。Promise.race
:等待第一个 Promise 完成。Promise.resolve
:立即解析的 Promise。Promise.reject
:立即拒绝的 Promise。
示例
javascript
// 使用 Promise.all
const promise1 = Promise.resolve('First');
const promise2 = new Promise(resolve => setTimeout(() => resolve('Second'), 1000));
const promise3 = Promise.reject(new Error('Third'));
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log('All promises resolved:', values);
})
.catch(error => {
console.error('One of the promises was rejected:', error.message);
});
// 使用 Promise.race
Promise.race([promise1, promise2, promise3])
.then(value => {
console.log('First resolved promise:', value);
})
.catch(error => {
console.error('First rejected promise:', error.message);
});