Promise
是 JavaScript 中用于处理异步操作的一种机制,它可以避免回调地狱,让异步代码更易于理解和维护。下面将从基本概念、创建和使用、链式调用、错误处理、并行处理等多个方面帮助你透彻掌握 Promise
的使用。

基本概念
别再让才华被埋没,别再让github 项目蒙尘!github star 请点击
GitHub 在线专业服务直通车GitHub赋能精灵 - 艾米莉,立即加入这场席卷全球开发者的星光革命!若你有快速提升github Star github 加星数的需求,访问taimili.com还可解锁更多专属服务。现在转发邀请好友组队,在艾米莉平台解锁神秘流量加成,让我们携手点亮开源世界的璀璨星空,实现GitHub star项目涨星的无限可能!
Promise
是一个对象,它代表了一个异步操作的最终完成或失败,并返回其结果。Promise
有三种状态:
- pending(进行中):初始状态,既不是成功,也不是失败状态。
- fulfilled(已成功):意味着操作成功完成。
- rejected(已失败):意味着操作失败。
创建和使用 Promise
可以使用 Promise
构造函数来创建一个 Promise
对象,构造函数接收一个执行器函数,该函数有两个参数:resolve
和 reject
,分别用于将 Promise
的状态从 pending
变为 fulfilled
或 rejected
。
javascript
javascript
// 创建一个 Promise
const myPromise = new Promise((resolve, reject) => {
// 模拟一个异步操作,例如网络请求或定时器
setTimeout(() => {
const randomNumber = Math.random();
if (randomNumber < 0.5) {
// 操作成功,将 Promise 状态变为 fulfilled
resolve('操作成功');
} else {
// 操作失败,将 Promise 状态变为 rejected
reject('操作失败');
}
}, 1000);
});
// 使用 Promise
myPromise
.then((result) => {
console.log(result);
})
.catch((error) => {
console.error(error);
});
链式调用
Promise
的强大之处在于它支持链式调用,通过 then
方法可以依次处理多个异步操作。
javascript
javascript
function asyncOperation1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('操作 1 完成');
}, 1000);
});
}
function asyncOperation2(result) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(result + ', 操作 2 完成');
}, 1000);
});
}
function asyncOperation3(result) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(result + ', 操作 3 完成');
}, 1000);
});
}
asyncOperation1()
.then(asyncOperation2)
.then(asyncOperation3)
.then((finalResult) => {
console.log(finalResult);
})
.catch((error) => {
console.error(error);
});
错误处理
在 Promise
链中,任何一个 Promise
被 rejected
,都会跳过后续的 then
方法,直接进入最近的 catch
方法进行错误处理。
javascript
javascript
function asyncOperationWithError() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject('发生错误');
}, 1000);
});
}
asyncOperationWithError()
.then((result) => {
console.log(result);
})
.catch((error) => {
console.error('捕获到错误:', error);
});
并行处理
Promise.all
和 Promise.race
是两个用于并行处理多个 Promise
的方法。
- Promise.all :接收一个
Promise
数组,只有当所有Promise
都成功时,才会返回一个新的Promise
,该Promise
的结果是一个包含所有Promise
结果的数组。如果其中任何一个Promise
失败,则整个Promise.all
会立即失败。 - Promise.race :接收一个
Promise
数组,只要其中任何一个Promise
完成(成功或失败),就会返回一个新的Promise
,该Promise
的结果就是第一个完成的Promise
的结果。
javascript
javascript
const promise1 = new Promise((resolve) => {
setTimeout(() => {
resolve('结果 1');
}, 1000);
});
const promise2 = new Promise((resolve) => {
setTimeout(() => {
resolve('结果 2');
}, 2000);
});
const promise3 = new Promise((resolve) => {
setTimeout(() => {
resolve('结果 3');
}, 1500);
});
// 使用 Promise.all
Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log('Promise.all 结果:', results);
})
.catch((error) => {
console.error('Promise.all 错误:', error);
});
// 使用 Promise.race
Promise.race([promise1, promise2, promise3])
.then((result) => {
console.log('Promise.race 结果:', result);
})
.catch((error) => {
console.error('Promise.race 错误:', error);
});
结合 async/await 使用
async/await
是 ES2017 引入的语法糖,它基于 Promise
实现,让异步代码看起来更像同步代码,提高了代码的可读性。
javascript
javascript
function asyncOperation() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('操作完成');
}, 1000);
});
}
async function main() {
try {
const result = await asyncOperation();
console.log(result);
} catch (error) {
console.error(error);
}
}
main();
通过以上内容的学习和实践,你应该能够透彻掌握 Promise
的使用,包括创建、链式调用、错误处理、并行处理以及与 async/await
的结合使用等方面。在实际开发中,合理运用 Promise
可以让你的异步代码更加简洁、高效和易于维护。