- Promise是ES6新增的用于异步编程的一个类。通过链式调用的形式可以解决以往异步编程出现的“回调地狱”的情况。
- Promise本质上还是调用的回调函数,其内部维护了状态、兑现回调、拒绝回调,在状态变更时回调对应的函数。
- Promise对象有then()、catch()和finally()三个成员方法,都会返回一个新的Promise对象,这是实现“期约链”的核心。
- Promise还有resolve()、reject()、all()、race()等在原型对象上的静态方法,分别返回“fulfilled”和“rejected”状态的Promise对象,以及并行执行多个期约。
- then()方法接收两个函数类型参数,第一个和第二个函数分别在Promise被兑现和拒绝(调用reject函数或抛出异常)时被调用。
then()方法的函数参数的返回值决定了Promise对象的状态:
若返回非Promise类型的值,则期约对象立即解决并被兑现;若抛出异常则会被拒绝;而返回Promise类型的值,期约状态会保持“pendding”待解决状态直到该返回的期约被兑现或拒绝,此时期约会以同样的值被兑现或拒绝。
new Promise((resolve, reject) => {
setTimeout(() => {resolve('2s')}, 2000);
})
.then(val => val, val => {console.log('rejected:'+val);return val;});
- catch()会在Promise被拒绝时被调用,相当于then(null, fn)
new Promise((resolve, reject) => {
setTimeout(() => {reject('2s')}, 2000);
})
.catch(val => {console.log('rejected:'+val);return val;});
- finally()会在Promise落定之后被调用,不论兑现或拒绝;回调函数无参数;其返回值一般被忽略;若抛出异常,则以该异常值拒绝期约。
new Promise((resolve, reject) => {
setTimeout(() => {resolve('2s')}, 2000);
})
.finally(() => {console.log('finally');});
- Promise.resolve()、Promise.reject()会返回一个以传入值兑现或拒绝的Promise对象。
- Promise.all()可以并行执行多个期约,它接受一个期约对象的数组。它返回的期约对象会在传入的期约中的任何一个期约被拒绝时拒绝;否则以这些期约兑现的值组成的数组来兑现。
- Promise.race()也可以并行执行多个期约,但是它返回的期约对象会在这些期约中有一个被兑现或拒绝时立即兑现或拒绝。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南