Promise
1|0Promise
在没有promise之前,所有异步代码都是用回调函数处理。而随着 JavaScript 的发展庞大,回调函数的处理方式在开发上的问题愈加明显。
- 多重嵌套的回调地狱,代码难以维护。
- 由于异步操作导致语句无法使用的 return 与 try/catch 。
- 回调函数之前难以建立联系,需要在共同的外层作用域增加标识。
1|1promiseA+规范
promiseA+规范是 es5 提出引入的,内容包括:
-
不管做什么操作都返回一个 promise 对象
-
promise 有三种状态:
3.then 执行的是上一个 promise 对象,而注册函数则是第一个 promise。
then 返回的是一个新的 promise 对象,当上一个 promise 的回调执行结束后,新 promise 的状态变为 fulfilled。新 promise 的 then 执行又再次生成新的 promise 对象 ,依此类推就形成了链式调用。
promiseA+ 规范的实现:
- ES6:Promise,yield。
- ES7:async,await。
- Angular:$q。
- Node:q,co,then。
此处开始下文中的 Promise 即指 ES6 的 Promise
1|2ES6 Promise
Promise 为一个构造器对象,只能使用通过 new 关键字生成实例。
promise 的三种状态:
- Pending ( 对应 Unfulfilled )
- Fulfilled( 对应 Fulfilled )
- Rejected ( 对应 Failed )
fulfilled 与 rejected 状态也被称为 settled 状态,或被称为 resolved。
- Promise.prototype.then(onFulfilled,onRejected)
promise 进入 Fulfilled 状态后执行,并返回一个新 promise 实例
当 then 有第二个参数 onRejected 时,promise 进入 Rejected 状态后执行, 并返回一个新 promise 实例 - Promise.prototype.catch(onRejected)
promise 进入 Rejected 状态后执行, 并返回一个新 promise 实例
- Promise.prototype.finally(onSettled)
promise 进入 Settled 状态后执行,并返回一个新 promise 实例
finally 并不会终结链式执行
onSettled 不接受 promise 的返回值
finally 所生成的 promise 以上一个 then 的返回值进入 Fulfilled 状态,以自身的返回值 返回值进入 Rejected 状态。 - Promise.resolve(value)
返回一个 settled 状态的 promise,具体 settled 状态由该 value 的 then 决定。
当返回的 value 为空或者为基本类型的数据或者不带then
方法的对象时,promise 状态为 fulfilled。 - Promise.reject(reason)
返回 rejected 状态的 promise
模拟 Promise 实现
Promise.all(iterable)
Promise.all 接收类数组结构的 promise 数据
当 iterable 内的 promise 都为 fuifilled 状态时,Promise.all 返回 fuifilled 状态的 promise。
其返回值为一个将 iterable 内 promise 的返回值以相同的顺序组合成的数组。
当 iterable 内的 promise 出现 rejected 状态时,Promise.all 返回 rejected 状态的实例,其值为出现 rejected 状态的 promise 的返回值。
Promise.race(iterable)
Promise.race 也是接收类数组结构的 promise 数据,返回第一个进入 settled 状态的 promise。
1|3async / await
es7 新增语法,支持同步的方式编写异步函数
__EOF__

本文链接:https://www.cnblogs.com/qingzhao/p/16571905.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!