前端 面试----手写promise(promise自定义封装)

Promise函数的基本了解

----------简单来说,promise函数是为了解决异步回调时的一些问题,更准确来说是为了解决我们在开发中,经常会面临的“回调地狱”所给开发者带来的困扰。promise可以被理解成一个方案,来有助于我们快速规避这些麻烦,从而提高我们的开发效率。

----------我们知道一个Promise函数的状态必然处于以下几种状态中的一个:

  • 待定(pending) :初始状态,既没有被兑现,也没有被拒绝。
  • 已兑现(fulfilled) :意味着操作成功完成。
  • 已拒绝(rejected) :意味着操作失败。

为什么要使用Promise

----指定回调函数的方式更加灵活

旧的:必须在启动异步任务前指定

promise:启动异步任务=》返回promise对象=》给promise对象绑定回调函数(甚至可以在异步任务)

----支持链式调用,可以解决回调地狱问题

那什么是回调地狱---》回调函数调用,外部回调函数异步执行的结果是嵌套的回调执行的条件,其缺点不方便阅读,不便于异常处理,解决方案是promise链式调用。

promise内置的几种方法

既然我们知道了promise的作用之后,我们就来谈谈promise函数所内置的几个API,也就是方法,这些方法在我们往后的学习和工作当中会被反复的使用,因此要熟悉这些API能实现的功能变的尤为重要:

  • resolve:promise构造函数上挂载或在内部定义的方法,表示一个“成功”时的状态,且此状态一旦生成就不可逆,此过程也称为“敲定”了这个状态。

  • reject:promise构造函数上挂载或在内部定义的方法,表示一个“失败”时的状态,且此状态一旦生成就不可逆,此过程也称为“敲定”了这个状态。

  • then:promise.then方法返回的结果也是一个promise函数,准确来说是一个对象,这个对象中有then方法返回的promise对象及其所处的状态和结果值等,因此这个新对象也可以使用promise所内置的方法。

  • catch:catch在promise中经常用来快速捕捉异常,例如捕捉throw抛错时而导致的非正常状态,在自定义封装中我们用try ...catch来搭配使用,catch返回值是一个失败的promise对象。

  • all: promise中all方法的参数接受一个数组,这个数组的成员要满足都为promise对象。如果所有的promise对象状态都为“fulfilled”,也就是成功,all方法返回一个状态也为成功的promise对象,此对象内部的结果值为此成功的数组。若有一个promise成员的状态为失败,那么all方法就会返回一个失败的promise对象,其状态为"rejected",其内部结果值为这个数组中失败的promise函数的结果值。

  • race: promise中race方法的参数接受一个数组,这个数组的成员要满足都为promise对象,race方法返回一个promise对-象,这个对象的状态由数组中第一个状态改变的promise函数决定,且两个对象的状态保持一致,且其结果值为数组中第一个状态改变的promise函数的结果值。

Promise对象状态改变的三种方式

  1. resolve('ok');//状态改变pending---->fulfilled(resolved)
  2. reject ('error');//状态改变pending---->rejected
  3. throw '抛出错误了'//抛出错误

Promise.then()返回的新的promise的结果状态由什么决定?

简单表述:由then()指定的回调函数执行的结果决定

 

----Promise.reject

该方法将始终返回一个为失败的Promise对象,无论参数是否为Promise类型还是其他,最终都是放回失败的Promise。

----Promise下的resolve方法

作用:将一个普通的值转化为Promise类型的数据,

  分两种情况:

1.当resolve方法参数为非Promise对象,则返回的结果为成功的Promise对象

2.当resolve方法参数为Promise对象,则参数对象的状态和结果将直接影响最终resolve方法的

返回值的那个对象的状态和结果

--------finally

是ES9中新增的特性,表示无论Promise对象变成了fulfilled还是rejected状态,最终都会执行finally方法的回调函数参数是不接受参数的

html代码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>promise.all</title>
    <style></style>
    <script src="./promise.js"></script>
</head>

<body>
    <script>
 // 欢迎来到 我的世界-

        // 基本格式
        let p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('执行value')
                console.log(1);
            }, 100)
            console.log(2);

        })
        p.then(value=>{
            console.log(3);
        },reason=>{
            console.log(4);
        })

        console.log(5);
  </script>
</body>

</html>

js代码

// 定义promise构造函数
function Promise(executor) {
    // 设置默认状态和默认值
    this.PromiseState = 'pending'
    this.PromiseResult = null

    // 设置一个空数组,异步时调用
    this.callbacks = []

    // this赋给self
    const self = this

    // 成功时的函数
    function resolve(data) {
        // 判断此时的p的状态是否已经改变
        if (self.PromiseState !== 'pending') return

        // 设置实例成功时的状态和结果值
        self.PromiseState = 'fulfilled'
        self.PromiseResult = data

        // 执行调用函数为resolve的异步任务
        self.callbacks.forEach(item => {
            item.onResolved(data)
        })
    }

    // 失败时的函数
    function reject(data) {
        // 判断此时的p的状态是否已经改变
        if (self.PromiseState !== 'pending') return


        // 设置实例成功时的状态和结果值
        self.PromiseState = 'rejected'
        self.PromiseResult = data

        // 执行调用函数为reject的异步任务
        self.callbacks.forEach(item => {
            item.onRejected(data)
        })
    }


    // 执行函数并捕捉可能存在的异常
    try {
        executor(resolve, reject)
    } catch (e) {
        reject(e)
    }
}

// 在promise函数原型上挂载一个then方法
Promise.prototype.then = function (onResolved, onRejected) {
    const self = this
    // 若用户没有传入onResolved箭头函数
    if (typeof onResolved !== 'function') {
        onResolved = value => value
    }


    // 若用户没有传入onRejected箭头函数
    if (typeof onRejected !== 'function') {
        onRejected = resaon => {
            throw resaon
        }
    }


    return new Promise((resolve, reject) => {


        // 封装common函数
        function common(type) {
            try {
                // 执行函数,并且把执行结果赋值给result变量
                let result = type(self.PromiseResult)

                if (result instanceof Promise) {
                    result.then(v => {
                        resolve(v)
                    }, r => {
                        reject(r)
                    })
                } else {
                    resolve(result)
                }

            } catch (e) {
                reject(e)
            }
        }

        // 成功时的then
        if (this.PromiseState === 'fulfilled') {
            setTimeout(() => {
                common(onResolved)
            })
        }

        // 失败时的then
        if (this.PromiseState === 'rejected') {
            setTimeout(() => {
                common(onRejected);
            })

        }


        // 异步执行的then
        if (this.PromiseState === 'pending') {
            self.callbacks.push(
                {
                    onResolved: function (data) {
                        common(onResolved)
                    },

                    onRejected: function (data) {
                        common(onRejected)
                    }
                }
            )
        }
    })

}

// 给构造函数Promise挂载resolve函数
Promise.resolve = function (data) {
    return new Promise((resolve, reject) => {
        if (data instanceof Promise) {
            data.then(v => {
                resolve(v)
            }, r => {
                reject(r)
            })
        } else {
            resolve(data)
        }
    })
}


// 给构造函数Promise挂载reject函数
Promise.reject = function (data) {
    return new Promise((resolve, reject) => {
        reject(data)

    })
}

// 挂载catch方法
Promise.prototype.catch = function (onRejected) {
    return this.then(undefined, onRejected)
}

// 挂载all方法
Promise.all = function (promises) {
    return new Promise((resolve, reject) => {
        let count = 0;
        let arr = []

        for (let i = 0; i < promises.length; i++) {
            promises[i].then(v => {
                count++;
                arr[i] = v

                if (count === promises.length) {
                    resolve(arr)
                }
            }, r => {
                reject(r)
            })
        }

    })
}

// 挂载race方法
Promise.race = function (promises) {
    for (let i = 0; i < promises.length; i++) {
        return new Promise((resolve, reject) => {
            promises[i].then(v => {
                resolve(v)
            }, r => {
                reject(r)
            })
        })
    }
}

代码优化的步骤:

  • 实现异步任务的成功执行
  • promise构造函数优化
  • then方法返回值优化
  • 完善then方法的内部代码
  • 封装common函数,提高代码的可读性
  • 在promise构造函数上挂载一个resolve和reject方法
  • 为promise构造函数挂载catch方法

  • 为promise构造函数挂载all方法

  • 为promise构造函数挂载race方法

  • 异步打印的相关优化

wxyjusoo
关注 关注
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端面试大全:手写 Promise
itKingOne的博客
01-15 2504
(内容同步自小邹的头条号:沪漂程序员的生活史) 在上一篇文章中我们了解了 Promise 的一些易错点,那这一篇文章,我们会通过手写一个符合 Promise/A+ 规范的 Promise 来深入理解它,并且手写 Promise 也是一道大厂常考题,在进入正题之前,推荐各位去网上找下Promise/A+规范,这样才能更好地理解这个章节的代码。   实现一个简易版 Promise 在完成符...
前端面试题 - 手写一个Promise
weixin_46557501的博客
10-08 872
前端面试题 - 手写一个Promise问题一:同步与异步的区别?问题二:为什么使用Promise?问题三:手写一个Promise?问题四:前端异步都有哪些场景? 问题一:同步与异步的区别? JavaScript是单线程语言,同步会阻塞代码执行,异步不会阻塞代码执行。 补充:JavaScript是单线程语言,意味着只能同时做一件事。也就是说,发送请求遇到阻碍时,浏览器会卡住,卡住期间不能滚动、不能点击、不能有动画。异步是基于callback回调函数形式来调用的,每个异步都有回调函数。代码执行的顺序,先执行同步
手写promise-面试
2402_85402030的博客
06-05 956
then回调是支持链式调用的,也就是then.then.then,并且由api特性可知then是return一个promise的,并且这个promise的res是上一个promise的。,仔细看这一步,我们之前的想法是让这个定时器回调push到队列中,但如果这样写的话相当于将回调执行后的返回值push到队列中,仔细想想是不是这样呢!的then回调,当then回调检测到状态没有发生改变则将回调函数push到各种的队列中,状态发生改变后在从队列中取出回调函数执行。时then回调会出现问题。
超详细!全面搞懂手写Promise其过程
最新发布
书呆子ITme
08-13 1724
Promise是JavaScript中用于处理异步操作的一种方式。它提供了一种简洁且强大的方法来处理异步代码,避免了方法回调。本文将详细讲解如何从零开始手写一个Promise,帮助您深入理解其工作原理。PromisePending(待定):初始状态,既不是成功也不是失败。Fulfilled(已兑现):操作成功完成。Rejected(已拒绝):操作失败。通过手写Promise,我们深入了解了其内部工作原理。希望这篇技术文档对您理解Promise有所帮助。如果在实践中遇到问题,建议参考ES6标准中的。
手写Promise前端面试~
前端_小白白白白的博客
02-28 540
手写Promise前端面试必备!!! 相信很多小伙伴在笔试的时候可能都见过手写promise 这道题,不知道有没有跟我一样看到这道题一点思路都没有,一行代码也写不出来的,多多少少还是因为我们对promise解决异步编程还不太熟悉,如果想对promise有更深入的了解,推荐去看尚硅谷李超老师讲的Promise教程从入门到精通,由浅入深,比较容易听得懂。本篇文章就是根据视频教程写下的笔记。 先对promise的有初步的认识,promise对象有三个状态(PromiseState),分别是①pending初始
前端必须学会的经典面试题场景之一 —— 手写Promise
weixin_46709512的博客
06-06 2423
手写Promise的正确姿势~ 前端面试涨薪必学,从0实现Promise
手写一个Promise
weixin_34019929的博客
03-16 712
promise Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。一旦成功就不允许失败,一旦失败就不允许成功。 function Promise(excutor) { let self = this self.status = 'pending' self.value = null self.reas...
前端面试重点--promise
li520_fei的博客
04-19 650
文章目录ES6-promise1.Promise 是什么2.promise 的状态改变3.promise 的基本流程4.为什么要用 Promise5.Promise的API6.一些关键问题7.promise基本使用代码1)初体验_抽奖2)fs读取3).Ajax4).读取文件函数封装5).util.promisify 方法6).封装AJAX操作8.手写promise构造函数版本class版本9.async 与 await ES6-promise 1.Promise 是什么 Promise 是一门新的技术(
Promise自定义 - 手写Promise - Promise.all - Promise(executor)
YK菌的博客
03-07 4240
文章目录3. 自定义(手写)Promise 3. 自定义(手写)Promise
前端面试----深信服面试题全概
huohuoit的博客
07-16 4450
这里结合了CSDN多位博主的深信服面试题,为了锻炼自己的答题能力和技术点理解,这里对博主的各个题目进行了自己的解答(最好用自己的理解自己的话解答),同时部分解答借鉴了博主的回答。记在word笔记的时候没有记录博主地址,但还是感谢分享,一起努力加油啊! 一、HTML (1)常见的HTML块级元素和行内元素 (2)HTML5的新标签有什么了解,详述一下表单的新标签 (3)Image标签中alt和title有什么区别 二、CSS (1)CSS盒子模型(IE盒子模型,标准盒子模型) (2)CSS元素居
前端进阶面试-JS面试题(阿里、字节、腾讯、美团面试高频)
2401_84150137的博客
04-22 710
前端CSS面试题文档,JavaScript面试题文档,Vue面试题文档,大厂面试题文档,需要的读者可以戳这里免费领取!年进入阿里一直到现在。**深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
前端大厂最新面试题-vivo.docx
06-06
"前端大厂最新面试题-vivo.docx" 前端工程师面试题目分析 在本文档中,我们可以看到 vivo 前端工程师面试题目的详细信息。本文档共有 10 个问题,涵盖了前端开发中的一些关键技术点。下面,我们将逐一分析每个问题...
前端面试必问问题:手写promise
weixin_44191250的博客
06-23 326
大厂必备技能,手写promise
前端面试手写promise
叫我阿豪
12-16 336
大厂面试一般喜欢问的底层源码手写,废话不多说,直接上代码!
面试准备之手写Promise
weixin_49172439的博客
04-30 2416
本文是我在看完尚硅谷Promise教程后整理的手写Promsie,内容可能会稍许有点偏差,仅供参考。 当然,都看到手写Promise了,所以肯定对Promise的基本使用是没问题了,下面就来看看如何手写一份Promise吧。 一、搭建Promise骨架 新建lib文件夹,添加Promise.js文件。 首先采用ES5语法实现,后续会讲解ES6语法实现 // 自定义Promise函数模块: IIFE (function (window) { // Promise构造函数 // executor
手写Promise
XunLin233的博客
05-30 2000
在index.html中编写如下代码resolve("执行成功");})})创建一个promise.js文件在index.html中引入1. Promise能够通过new的方式调用,所以Promise是构造函数的形式。2. 构造Promise实例的时候传过去了一个函数,使用executor(执行器函数接收这个形参)。3. Promise实例能够调用then方法,所以在构造函数的原型上要添加then方法。4. then方法接收两个函数。// Promsie构造函数// 添加then方法。
手写promise
GuoZebin的博客
05-31 419
前几天在看知乎的时候,无意间发现了一道面试题,手写promise,因为没研究过promise的实现,所以对这个问题也是一脸懵逼,忍不住就研究了一下。 try { module.exports = Promise } catch (e) {} function Promise(executor) { var self = this self.status = 'pendi...
TensorFlow实现LeNet-5:MNIST手写数字识别
"该资源是关于使用TensorFlow实现LeNet-5神经网络模型来识别MNIST手写数字数据集的教程。适合初学者,源码已经修正,可以正常运行。" 在深度学习领域,LeNet-5是一个经典的卷积神经网络(CNN)模型,由Yann LeCun等...
写文章

热门文章

  • idea创建web项目,并连接数据库,在网页输出 11175
  • 学习:浏览器设置Burpsuite代理后打不开网页 10564
  • Javaweb 学习---ajax应用(获取单选框,复选框的值) 1500
  • 前端 面试----手写promise(promise自定义封装) 963
  • 初学 sql注入 389

最新评论

  • 学习:浏览器设置Burpsuite代理后打不开网页

    小d没吃饱: 谢谢☺️

  • 学习:浏览器设置Burpsuite代理后打不开网页

    seagull930: 是不是开了 intercept is on ,网页打不开是正常现象,打开了才不正常?

  • 学习:浏览器设置Burpsuite代理后打不开网页

    代码小白55555555555: 太感谢了,搞了好久!!

  • 学习:浏览器设置Burpsuite代理后打不开网页

    阿海~: <script>alert(/xss/)</script>

  • idea创建web项目,并连接数据库,在网页输出

    あ北山小墨: 比如在项目结构-依赖 中添加Tomcat 的jsp和servlet 这个添加我打开没有

最新文章

  • 管理界面(element ui)的使用
  • Javaweb 学习---ajax应用(获取单选框,复选框的值)
  • Port 8080 is already in use
2023年3篇
2022年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家商场春季美陈吊饰玻璃钢雕塑市场前景如何广东玻璃钢装饰雕塑厂家驻马店商场美陈植物墙曲阳正规玻璃钢雕塑畅销全国新密玻璃钢雕塑雕刻加工玻璃钢人像雕塑哪家正规河北环保玻璃钢雕塑销售厂家高温玻璃钢雕塑淮北玻璃钢雕塑制作厂河南价值观玻璃钢仿铜雕塑扬州公园玻璃钢雕塑生产厂家玻璃钢石头仿真雕塑定制玻璃钢雕塑市场豫莲花玻璃钢雕塑弥勒佛图片邵阳公园玻璃钢雕塑公司庆阳大型玻璃钢雕塑制作扬州弧形玻璃钢花盆嘉兴玻璃钢陶瓷雕塑图片无锡专业玻璃钢雕塑信息推荐玻璃钢猫吃鱼雕塑鹰潭玻璃钢雕塑生产厂家广西玻璃钢鲨鱼雕塑室内玻璃钢雕塑制造泰州白色玻璃钢花盆漯河大型不锈钢玻璃钢雕塑厂家玻璃钢马车的雕塑图片东莞发光动物玻璃钢雕塑正宗玻璃钢雕塑性价比出众商场美陈周年庆活动方案香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化