前端面试之问到promise怎么办?

本文详细介绍了如何手动实现Promise的基本功能,包括`.then`和`.reject`,并结合前端开发的学习资源,如《2024年Web前端开发全套学习资料》和面试题集,为开发者提供系统学习路径和面试准备支持。
摘要由CSDN通过智能技术生成

}

}

const client = new XMLHttpRequest();

client.open(type, url);

client.onreadystatechange = handler;

client.responseType = ‘json’;

client.setRequestHeader(“Accept”, “application/json”);

client.send();

})

return promise;

}

return {

ajax

};

})()

调用方式:

$.ajax(“/posts.json”).then(function(json) {

console.log('Contents: ’ + json);

}, function(error) {

console.error(‘出错了’, error);

});

(二)手动实现一个 Promise/A


要注意的几个点:1.*then方法会返回一个新的promise,因此then方法应该写到原型链上。2.promise 的返回值或者抛出的err 会有传递现象。

例如:

new Promise(resolve=>resolve(8))

.then()

.catch()

.then(function(value) {

alert(value)

})

// 根据promise的定义和调用方式,可以先写出promise的数据结构

function Promise(executor){

const _this = this;

_this.status = ‘pending’;

_ths.data = undefined;

_this.onRejectedCallback = [];

_this.onResolvedCallback = [];

function resolve(value){

if(_this.status === ‘pending’){

_this.status = ‘resolved’;

_this.data = value;

for(let i=0;i<_this.onResolvedCallback.length;i++){

_this.onResolvedCallbacki;

}

}

}

function reject(reason){

if(_this.status === ‘pending’){

_this.status = ‘rejected’;

_this.data = reason;

for(let i=0;i<_this.onResolvedCallback.length;i++){

_this.onRejectedCallbacki;

}

}

}

try{

executor(resolve, reject);

}catch (e){

reject(e)

}

}

// then方法应该写在原型链上

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

const self = this;

// 要判断onResolved 和 onRejected是不是方法

onResolved = typeof onResolved === ‘function’ ? onResolved : function(value) { return value }

onRejected = typeof onRejected === ‘function’ ? onRejected : function(reason) { return reason }

if(self.status === ‘resolved’){

return new Promise(function(resolve, reject){

try{

const resoult = onResolved(self.data);

if( resoult instanceof Promise ){ // 如果返回的是新的promise,那么用这个promise的痛恨方法

resoult.then(resolve, reject)

}

resolve(resoult) // 否则 直接讲返回值作为newPromise的结果

}.catch(e){

reject(e);

}

});

}

// 此处与前一个if块的逻辑几乎相同,区别在于所调用的是onRejected函数,就不再做过多解释

if (self.status === ‘rejected’) {

return new Promise(function(resolve, reject) {

try {

var resoult = onRejected(self.data)

if (resoult instanceof Promise) {

resoult.then(resolve, reject)

}

} catch (e) {

reject(e)

}

})

}

if(self.status === ‘pending’){

return new Promise(function(){});

}

if (self.status === ‘pending’) {

// 如果当前的Promise还处于pending状态,我们并不能确定调用onResolved还是onRejected,

// 只能等到Promise的状态确定后,才能确实如何处理。

// 所以我们需要把我们的两种情况的处理逻辑做为callback放入promise1(此处即this/self)的回调数组里

// 逻辑本身跟第一个if块内的几乎一致,此处不做过多解释

return Promise(function(resolve, reject) {

self.onResolvedCallback.push(function(value) {

try {

var x = onResolved(self.data)

if (x instanceof Promise) {

x.then(resolve, reject)

}

} catch (e) {

reject(e)

}

})

self.onRejectedCallback.push(function(reason) {

try {

var x = onRejected(self.data)

if (x instanceof Promise) {

x.then(resolve, reject)

}

} catch (e) {

reject(e)

}

})

})

}

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

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

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

img

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

前端面试题汇总


前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。我做了一个整理,并且在技术博客找到了专业的解答,大家可以参考下:

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟


前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。我做了一个整理,并且在技术博客找到了专业的解答,大家可以参考下:

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟

春招面试的后期,运气和实力都很重要,自己也是运气比较好,为了回馈粉丝朋友们(毕竟自己也玩了这么久哈哈哈),整理个人感悟和总结以上。最后祝愿大家能够收获理想offer!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值