Promise源码解密-Promise A+标准,国内前端开发成果

  1. Promise源码解密-catch/resolve/reject/race

创作不易 拒绝白嫖 点个赞呗

关注专栏 Promise源码解密,带你走进Promise的深处!!!


术语


1. Promise

promise 是一个拥有 then 方法的 object 或 function ,其行为符合本规范

2. thenable

是一个定义了 then 方法的 object 或 function

3. 值(value)

指任何 JavaScript 的合法值(包括 undefined , thenable 和 promise);

4. 异常(exception)

通过throw抛出一个值

5. 原因(reason)

一个promise被拒绝的原因

class Promise {

constructor(executor) {

this.value = undefined;

this.reason = undefined;

}

}

function Promise(){}

Promise.prototype.then=function(){}

要求


1. Promise 的状态

当前Promise的状态只能是下面三种状态中的一种,不能存在多种状态。

示例:

const STATUS_PENDING = “pending”;

const STATUS_FULFILLED = “fulfilled”;

const STATUS_REJECTED = “rejected”;

class Promise {

constructor(executor) {

this.status = STATUS_PENDING;

}

}

1.1. 等待(Pending)

处于等待时,状态可以迁移至执行态或拒绝态

1.2. 执行(Fulfilled)

处于执行时:

  • 不能迁移至其他任何状态

  • 必须拥有一个不可变的终值

1.3. 拒绝(Rejected)

处于拒绝时:

  • 不能迁移至其他任何状态

  • 必须拥有一个不可变的reason

这里的不可变指的是恒等(即可用 === 判断相等),引用数据类型只要保证地址相等即可。

new Promise((resolve, reject) => {

resolve(‘成功’);

reject(‘拒绝’)

}).then((res) => {

console.log(res,“res”)

}, (error) => {

console.log(error,‘reason’)

})

new Promise()时状态是pending,

当程序执行,也就是(resolve, reject) => {

resolve(‘成功’);

reject(‘拒绝’)

},这个执行

这里resolve把值进行了this.value = “成功”;,但是并不会this.reason=‘拒绝’,

这是因为只有出现了执行就不会出现拒绝,最后输出的结果是"成功 res",

如果注释掉resolve(‘成功’);,最后输出的结果是 “拒绝 reason”。

2. Then 方法

一个 promise 必须提供一个 then 方法以访问其当前值、终值 和 reason。

promise 的 then 方法接受两个函数参数:

promise.then(onFulfilled, onRejected)

then((res) => {

console.log(res,“res”)

}, (error) => {

console.log(error,‘reason’)

})

2.1 onFulfilledonRejected 都是可选参数。
  • 如果 onFulfilled 不是函数,必须被忽略

  • 如果 onRejected 不是函数,必须被忽略

2.2 onFulfilled

如果 onFulfilled 是函数:

  • promise 执行结束后其必须被调用,其第一个参数为 promise的value

  • promise 执行结束前其不可被调用

  • 其调用次数不可超过一次

new Promise((resolve, reject) => {

resolve(123)

}).then(result => {

console.log(result);

}, error => {

console.log(error);

});

// 这里resolve执行结束才会执行then,这里的result就是终值

2.3 onRejected

如果 onRejected 是函数:

  • promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的reason

  • promise 被拒绝执行前其不可被调用

  • 其调用次数不可超过一次

2.4 调用时机

onFulfilledonRejected 只有在执行环境堆栈仅包含平台代码时才可被调用 >> 注1

2.5 调用要求

onFulfilledonRejected 必须被作为函数调用(即没有 this 值)>> 注2

2.6 多次调用

then方法可以被同一个promise 调用多次

  • promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调

  • promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调

new Promise.then().then()

2.7 返回

then 方法必须返回一个 promise 对象 >> 注3, 这也就是then可以被多次调用的原因。

Promise.prototype.then=function(onFulfilled, onRejected){

return new Promise()

}

promise2 = promise1.then(onFulfilled, onRejected);

  • 如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行下面的 Promise 解决过程[[Resolve]](promise2, x)

promise1.then((value)=>{

return x;

}, (reason)=>{

return x

}),

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

文末

js前端的重头戏,值得花大部分时间学习。

JavaScript知识

推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。

前端电子书

另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。

学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。

面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。

这是288页的前端面试题

288页面试题

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

67767.png)

另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。

学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。

面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。

这是288页的前端面试题

288页面试题

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-WVUSw6Lu-1712496941496)]

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Promise A是Promise/A规范的一部分,它定义了一种对Promise对象进行交互的方式。根据Promise/A规范,一个Promise对象需要暴露一个遵循Promise/A协议的then方法。这样的设计使得Promise的实现更加通用,因为只要一个对象暴露了符合规范的then方法,它就可以被视为Promise对象,而不必强制要求完全符合规范。这也使得符合Promise/A规范的实现可以与不太规范但可用的实现能够很好地共存。 在Promise的解决过程中,[[Resolve]](promise, x)是一个抽象操作,它接收一个Promise对象和一个值作为输入。如果值x有then方法且看起来像一个Promise对象,那么解决过程将尝试让promise接收x的状态。否则,解决过程将使用x的值来完成(fulfilled)promise。 一个Promise代表一个异步操作的最终结果,通过它的then方法与Promise进行交互。then方法注册了两个回调函数,用于接收Promise的最终结果或导致Promise无法被完成(fulfilled)的原因。通常,第一个回调函数用于处理Promise的成功情况,第二个回调函数用于处理Promise的失败情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Promises/A+ 规范](https://blog.csdn.net/u014627807/article/details/120011719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值