let x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
})
}
- 如果
onFulfilled
或者onRejected
抛出一个异常e
,则promise2
必须拒绝执行,并返回拒因e
promise1.then((value)=>{
throw new Error()
}, (reason)=>{
throw new Error()
}),
// 这种情况直接
Promise.prototype.then=function(onFulfilled, onRejected){
return new Promise((resolve,reject)=>{
try {
// console.log(“执行 onFulfilled”);
// 这里的x是啥? 是then中回调的return的返回值
onFulfilled(this.value);
或者
onReject(this.reason)
} catch (e) {
reject(e);
}
})
}
- 如果
onFulfilled
不是函数且promise1
成功执行,promise2
必须成功执行并返回相同的值
promise1.then(1,2),
Promise.prototype.then=function(onFulfilled, onRejected){
if (this.status === STATUS_FULFILLED) {
return new Promise((resolve,reject)=>{
if(typeof onFulfilled !== “function” ){
resolve(onFulfilled)
}
if(typeof onRejected !== “function” ){
resolve(onRejected)
}
})
}
}
- 如果
onRejected
不是函数且promise1
拒绝执行,promise2
必须拒绝执行并返回相同的reason
promise1.then(1,2),
Promise.prototype.then=function(onFulfilled, onRejected){
if (this.status === STATUS_PENDING) {
return new Promise((resolve,reject)=>{
reject(onRejected)
})
}
}
Promise 解决过程是需要输入一个 promise 和一个值 x 的一个抽象的操作,称为 [[Resolve]](promise, x)
,如果 x
有 then
方法且看上去像一个 Promise ,解决程序即尝试使 promise
接受 x
的状态;否则其用 x
的值来执行 promise
。(x是返回值,请注意上面的例子)
解决过程步骤:
x
与 promise
相等
如果 promise
和 x
指向同一对象,直接 throw new TypeError
let p1=new Promise(resolve=>{
resolve()
})
let p2=p1.then(data=>{
// 返回了p2
return p2
})
x
是Promise
如果 x
是一个 Promise ,则使 promise
接受 x
的状态 >>注4:
-
如果
x
处于等待,promise
需保持等待直至x
被执行或拒绝 -
如果
x
处于执行,用相同的值执行promise
-
如果
x
处于拒绝,用相同的reason拒绝promise
x
为对象或函数
如果 x
为对象或者函数:
-
把
x.then
赋值给then
>> 注5 -
如果取
x.then
的值时抛出错误e
,则以e
为reason拒绝promise
-
如果then是函数,将x作为函数的作用域this调用。传递两个回调函数作为参数,第一个参数叫做resolvePromise
,第二个参数叫做rejectPromise:
-
如果
resolvePromise
以值y
为参数被调用,则运行[[Resolve]](promise, y)
-
如果
rejectPromise
以reasonr
为参数被调用,则以reasonr
拒绝promise
-
如果
resolvePromise
和rejectPromise
均被调用,或者被同一参数调用了多次,则优先采用首次调用并忽略剩下的调用 -
如果调用then方法抛出了异常e:
-
如果
resolvePromise
或rejectPromise
已经被调用,则忽略之 -
否则以
e
为reason拒绝promise
-
如果
then
不是函数,以x
为参数执行promise
-
如果
x
不为对象或者函数,以x
为参数执行promise
function resolvePromise(promise2, x, resolve, reject) {
// 用来保存是否已经reject或者resolve过
let called
if (promise2 === x) {
throw new TypeError(‘Chaining cycle detected for promise’)
}
// 如果是函数或者object的话先默认是promise
if (x != null && (typeof x === ‘object’ || typeof x === ‘function’)) {
try {
let then = x.then
// 如果then是函数的话
if (typeof then === ‘function’) {
// 为啥不直接x.then()
// 因为then已经判断过是不是function,但是x.then没有判断过
// 就让then执行 第一个参数是this 后面是成功的回调 和 失败的回调
// 这里的y是啥,如果x是promsie的话,那么y就是x中的resolve/reject的值
then.call(x, y => {
// 成功和失败只能调用一个
if (called) return;
called = true;
// resolve的结果依旧是promise 那就继续解析
resolvePromise(promise2, y, resolve, reject);
}, err => {
// 成功和失败只能调用一个
if (called) return;
called = true;
reject(err);
})
} else {
resolve(x); // 如果不是函数,那就直接返回结果
}
} catch (error) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
后话
对于面试,说几句个人观点。
面试,说到底是一种考试。正如我们一直批判应试教育脱离教育的本质,为了面试学习技术也脱离了技术的初心。但考试对于人才选拔的有效性是毋庸置疑的,几千年来一直如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。
所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
如此。除非你有实力向公司证明你足够优秀,否则,还是得乖乖准备面试。这也并不妨碍你在通过面试之后按自己的方式学习。
其实在面试准备阶段,个人的收获是很大的,我也认为这是一种不错的学习方式。首先,面试问题大部分基础而且深入,这些是平时工作的基础。就好像我们之前一直不明白学习语文的意义,但它的意义就在每天的谈话间。
所谓面试造火箭,工作拧螺丝。面试往往有更高的要求,也迫使我们更专心更深入地去学习一些知识,也何尝不是一种好事。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-yHcNDYh6-1712592179042)]