简单了解Promise
名词约定
promise的话,有以下名词约定:
promise
(首字母小写)对象指的是"Promise实例对象"Promise
(首字母大写且单数形式)表示"Promise构造函数"Promises
(首字母大写且复数形式)用于指代"Promises规范"
一、什么是promise:
-
Promise,简单来说就是一个
容器
,里面保存着某个未来才会结束的事件的结果。(通常是一个异步的结果) -
Promise也是在js中进行的异步编程的新的解决方案。(以前旧的方案是单纯的使用回调函数)
-
从语法和本质上来说的话,promise是一个构造函数,对外提供统一的API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。
-
从功能上来说的话,promise对象用来封装一个异步的操作,并且可以获得成功或失败的返回值。
-
JS中常见的异步操作:定时器、AJAX中一般也是异步操作(也可以同步),回调函数可以理解为异步(不是严禁的异步操作等...)
二、Promise的两个特点
- Promise对象的状态不受外界影响
1)pending
初始状态(也就是未决定的)
2)fulfilled
或 resolved
成功状态
3)rejected
失败状态
Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态。
- Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由pending变成fulfilled或者rejected(说白了就是:一个promise对象只能改变一次,无论成功或者失败都会有一个结果数据。成功称为value;失败称为reason)
三、为什么要使用Promise呢?
- promise使用回调函数更灵活,旧的回调函数必须在启动异步任务之前指定。
- promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至能在异步任务结束后指定多个)
- promise支持链式调用,可以完美的解决回调地狱的问题。(回调地狱就是多层回调函数嵌套使用,说白了就是套娃,这样就不利于阅读和异常处理)
四、使用new来创建一个promise对象
Promise接受一个「函数」作为参数,该函数的两个参数分别是resolve和reject。这两个函数就是就是「回调函数」
resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
五、Promise的API使用:
- Promise 的构造函数:Promise(executor){}
(1)executor 函数:执行器 (resolve,reject)=> {}。
(2)resolve 函数:内部定义成功时调用函数 value => {} 。
(3)reject 函数:内部定义失败时调用函数 reason => {} 。
注意:Promise内部会立同步即调用executor,异步操作在执行器里执行。
-
then()
方法:Promise.prototype.then(onResolved, onRejected)=> {}
(1) onResolved 函数:成功的回调函数 (value) => {}
(2) onRejected 函数:失败的回调函数 (reason) => {}
注:指定用于得到成功value的成功回调和用于得到失败reason的失败回调是返回一个新的promise对象。
-
catch()
方法:Promise.prototype.catch (onRejected) => {}
onRejected.函数: 失败的回调函数(reason)=> {}
注:只是失败的调用。then()的语法糖,相当于: then(undefined, onRejected)。
-
resolv()
方法:Promise.resolve(value)=> {}
value: 成功的数据或promise对象
注:如果传入的参数为非Promise类 型的对象,则返回的结果为成功promise对象,如果传入的参数为Promise 对象,则参数的结果决定了resolve 的结果。
-
reject()
方法:Promise.reject(reason) => {}
reason: 失败的原因
注:无论传入啥只返回一个失败的promise对象。
-
all()
方法:Promise.all(promises)=> {}
promises: 包含n个promise的数组
注:返回一个新的promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败。失败了返回那个失败值。
-
race()
方法:Promise.race(promises)=> {}
promises: 包含n个promise的数组
注:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态。
来一个例子:
let p1 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('yes');
},1000)
})
let p2 = Promise.resolve('success');
let p3 = Promise.resolve('come');
const result = Promise.race([p1,p2,p3]);
console.log(result);
【推荐】国内首个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代理技术深度解析与实战指南