Promise
Promise
异步编程
同步与异步
同步行为对应内存中顺序执行的处理器指令,每条指令都会严格按照它们出现的顺序来执行,而每条指令执行后也能立即获得存储在系统本地的信息
异步行为类似于系统中断,即当前进程外部的实体可以触发代码执行,让一个强制进程等待一个长时间的操作实现插队编程
异步返回值
通过setTimeout操作设定延后时间给异步操作提供一个回调
这里的setTimeout调用告诉JavaScript运行时在多少毫秒之后把一个函数推到消息队列上
失败处理
在初始化异步操作时定义回调,实现异步操作的失败处理
嵌套异步回调
如果异步返回值还依赖另一个异步返回值,就要求嵌套回调,随着代码越来越复杂,就会出现“回调地狱”
Promise的三种API
构造器
使用new来调用Promise的构造器来进行实例化,创建promise对象
创建新期约需要传入执行器函数做为参数
var promise = new Promise(function (resolve, reject){
//进行异步处理
//处理结束后,调用resolve或者reject
});
实例方法
使用promise.then()实例方法,对通过new生成的promise对象,设置其值在resolve或者reject时调用的回调函数
promise.then(onFulfilled, onRejected)
resolve(成功)时:onFulfilled 会被调用
reject(失败)时:onRejected 会被调用
静态方法
包括Promise.all()、Promise.resolve()等对Promise进行操作的辅助方法
Promise的概念
Promise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,原型上有then、catch等方法。
Promise对象有以下两个特点
1.对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
注意点
1、对象的状态不受外界影响,有三种状态:进行中、已成功、已失败,只有异步操作的结果可以决定当前是哪一种状态
2、一旦状态改变,就不会再变,任何时候都可以得到这个结果,promise对象的状态改变只有两种可能:从pending变为resolved和从pending变为rejected
promise简单的说就是一个容器,里面保存着某个未来才会结束的事件的结果
promise对象是一个构造函数,用来生成promise实例,
promise构造函数接受一个函数作为参数,而该函数有两个参数分别是resolve和reject,这两个参数又是两个函数
resolve函数的作用是将promise对象的状态从‘未完成’变为‘成功’,并将异步操作的结果作为参数传递出去
reject函数的作用是将promise对象的状态从‘未完成’变为‘失败’,并将异步操作报出的错误作为参数传递出去
Promise实例生成后可以用then方法分别指定resolved状态和rejected状态的回调函数
Promise是抽象异步处理对象以及对其进行各种操作的组件
Promise是把类似的异步处理对象和处理规则进行规范化并按照采用统一的接口来编写
promise代码编写方法:
用 new Promise 方法创建promise对象
用.then 或 .catch 添加promise对象的处理函数
说明
1.第二次对 resolve 的调用会被忽略,因为只有第一次对 reject/resolve 的调用才会被处理。进一步的调用都会被忽略
Promise.resolve
静态方法Promise.resolve(value)可以认为是new Promise()方法的快捷方式
resolve(42);会让这个promise对象立即进入确定(即resolved)状态,并将42传递给后面then里所指定的其他函数来执行
因为Promise.resolve(value);的返回值是一个promise对象,所以可以接着对其返回值进行 .then 调用resolve或者reject
.thenable是一个具有.then方法的对象,作用是什么?
总结:Promise.resolve方法的作用就是将传递给它的参数,填充(Fulfilled)到promise对象后并返回这个promise对象
Promise.reject
Promise.reject(error)也是类似的静态方法,是new Promise()方法的快捷方式
reject功能就是调用promise对象通过then指定的onRejected函数 ,并将错误(Error)对象传递给这个onRejected函数
它与resolve的不同之处在于promise内调用的函数是reject而不是resolve
#######Promise保证了每次调用都是以异步方式进行的
promise方法链
类似于原型链
then 注册 onFulfilled 时的回调函数
catch 注册 onRejected 时的回调函数
异常处理方法:
1.Promise采用 try-catch 风格,发生异常的时候,会被catch捕获并被由在此函数注册的回调函数进行错误处理
2.另一个策略是通过返回一个Rejected状态的promise对象来实现,这种方法不通过使用 throw 就能在 promise chain 中对 onRejected 进行调用
promise方法链中传递参数:
方法链中的task都是相互独立的,要想 Task A 给 Task B 传递一个参数,就是在Task A 中 return 的返回值,会在 Task B 执行时传给它
每个方法中 return 的值不仅只局限于字符串或者数值类型,也可以是对象或者promise对象等复杂类型
return的值会由 Promise.resolve(return的返回值); 进行相应的包装处理,因此不管回调函数中会返回一个什么样的值,最终 then 的结果都是返回一个新创建的promise对象
Promise#then 不仅仅是注册一个回调函数那么简单,它还会将回调函数的返回值进行变换,创建并返回一个promise对象。
Promise.all
Promise.all 接收一个 promise 对象的数组作为参数,当这个数组里的所有promise对象全部变为resolve或reject状态的时候,它才会去调用 .then 方法
Promise.all接收promise对象组成的数组作为参数
传递给Promise.all的promise并不是一个个的顺序执行的,而是同时开始、并行执行的
Promise.race
Promise.race也是接收一个promise对象数组为参数,但Promise.race只要有一个promise对象进入FulFilled或者Rejected状态的话,就会继续进行后面的处理
Promise.race在第一个promise对象变为Fulfilled之后,并不会取消其他promise对象的执行
捕获异常
1.使用promise.then(onFulfilled, onRejected)的话,在 onFulfilled 中发生异常的话,在 onRejected 中是捕获不到这个异常的
2.在promise.then(onFulfilled).catch(onRejected)的情况下,then 中产生的异常能在 .catch 中捕获
3.但是.then和.catch在本质上是没有区别的,需要分场合使用,什么场合?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~