22行 手写实现promise

news2024/11/24 13:06:45

面试题

const MyPromise=()=>{}

  const myPromise = new MyPromise((resolve) => {

            setTimeout(() => { resolve('hellow world') }, 2000)

        })

        myPromise.then((res) => {

            console.log(res)

            return "00"

        })

手写promise,面试了一个面试题,promise的标准是非常的复杂的,但是这里我们不探讨具体promise的实现,只正对上面的代码分析


代码拆解

  1. MyPromise接受了一个函数类型的参数,该函数类型又接受了一个resolve函数参数
  2. MyPromise执行后可以无限的then
  3. 步骤1里面的两个函数的执行都比步骤2里面的【then函数】执行慢,注意不是then函数里面的【参数函数】




根据表象看本质

MyPromise实力后可以执行then—>说明该函数实例后返回的对象里面有then方法,实现如下:

function MyPromise(fn) {
            let obj = {
                then: () => {
                  //…
                }
            }

            ///…

            return obj;

}

而then方法是接受一个函数参数的,我们改为如下

function MyPromise(fn) {

 //.....................
then: (fn) => {

//.....................

}


new MyPromise接受一个函数参数,这个函数是会马上执行的,我们代码改为如下

 

function MyPromise(fn) {
//..............
let obj = {/****/}

// 运行函数是会,传递resolve函数过去
fn(resolve)

//..............

}



当resolve函数执行的时候,就会触发未执行的then里面的函数,这时候我们就会想,then函数调用时候是不是会往MyPromise内部的某个数组里面存储这个函数,resolve时候再拿出来运行呢


我们来给MYPromise内部筛入一个数组并实现resolve函数,代码如下:
 

function MyPromise(fn) {

            let arr = [];

            let obj = {

                then: (fn) => {

                    //then执行的时候,给队列添加元素

                    arr.push(fn);

                    return obj;

                }

            }

            let resolve = (data) => {

                let fn = arr.shift();
                //resolve函数执行的时候,执行函数对咧里面的第一个元素
                if (fn) {

                   fn(data);

                }

            }

            fn(resolve)

            return obj;

}

实例MyPromise后,调用实例的then函数,如果有放回数据,就把数据传递给下一个【then参数】里面的【函数的参数】

实现时候,实际上就是把当前函数的执行结果传递给下一个函数对咧里面的函数并执行
代码如下:

function MyPromise(fn) {

            let arr = [];

            let obj = {

                then: (fn) => {

                    arr.push(fn);

                    return obj;

                }

            }

            let resolve = (data) => {

                let fn = arr.shift();

                if (fn) {

                    //如果then里面没有return一样会执行后面的then,只是then的参数内容为undefined

                    let result = fn(data);
//自调用,递归调用,执行函数队列的元素,并传递数据

                    resolve(result)

                    

                }



            }

            // 你的代码

            fn(resolve)

            return obj;

        }


到此完成,demo

最终代码和调用方式:

function MyPromise(fn) {

            let arr = [];

            let obj = {

                then: (fn) => {

                    arr.push(fn);

                    return obj;

                }

            }

            let resolve = (data) => {

               // console.log("arr", arr)

                let fn = arr.shift();

                if (fn) {

                    //如果then里面没有return一样会执行后面的then,只是then的参数内容为undefined

                    let result = fn(data);

                    resolve(result)

                    

                }



            }

            // 你的代码

            fn(resolve)

            return obj;

        }





        const myPromise = new MyPromise((resolve) => {

            setTimeout(() => { resolve('hellow world') }, 2000)

        })

        myPromise.then((res) => {

            console.log(res)

            return "00"

        }).then((res) => {

            console.log("res2", res)

            return "222"

        }).then((res) => {

            console.log("res3", res)

           // return "222"

        }).then((res) => {

            console.log("res4", res)

           // return "222"

        }).then((res) => {

            console.log("res5", res)

           // return "222"

        })

拓展

那finally函数如何实现呢??🤔🤔思考。。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)

文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 1.2 图的矩阵表示1.2.1 邻接矩阵1.2.2 可达矩阵1.2.3 关联矩阵1.2.4 权矩阵 写在最后 引言 按照正常进度应该学习动态规划了,但我想…

Java/Lombok Slf4j日志配置输出到文件中

1、概述 新项目需要增加日志需求,所以网上找了下日志配置,需求是将日志保存到指定文件中。网上找了下文章,发现没有特别完整的文章,下面自己整理下。 1、Java日志概述 对于一个应用程序来说日志记录是必不可少的一部分。线上问题…

每日刷题(回溯法经典问题之子集)

食用指南:本文为作者刷题中认为有必要记录的题目 前置知识:回溯法经典问题之组合 ♈️今日夜电波:想着你—郭顶 1:09 ━━━━━━️💟──────── 4:15 …

Java“牵手”微店商品列表数据,关键词搜索微店商品数据接口,微店API申请指南

微店商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取微店商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问微店商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

电子元器件采购中的供应链透明度

在电子元器件采购中,供应链透明度是一个至关重要的因素。它指的是能够清晰、实时地了解整个供应链的运作和流程,以及相关的信息和数据。供应链透明度在采购中具有多方面的优势和重要性,包括以下方面: 库存管理: 透明的…

『C语言进阶』指针进阶(一)

🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…

交叉编译嵌入式linux平台的gdb工具

目录 前期准备: 开始编译: 配置编译环境: 配置交叉编译工具链: 创建交叉编译产物的目录: termcap: ncurses: gmp: gdb: 编译产物: 前期准备&#x…

IT设备监控软件有哪些功能

IT设备监控软件通常可以实现以下功能:  设备状态监控:可以实时监测IT设备的运行状态,如设备的温度、湿度、风扇转速等,以及设备的开机、关机、重启等事件。  性能指标监控:可以监测IT设备的各项性能指标&#xff0…

rtthread下spi device架构MCP25625驱动

1.CAN驱动架构 由于采用了RTT的spi device架构,不能再随心所遇的编写CAN驱动 了,之前内核虽然采用了RTT内核,但是驱动并没有严格严格按RTT推荐的架构来做,这次不同了,上次是因为4个MCP25625挂在了4路独立的SPI总线上&…

前端(十六)——Web应用的安全性研究

🙂博主:小猫娃来啦 🙂文章核心:Web应用的安全性研究 文章目录 概述常见前端安全漏洞XSS(跨站脚本攻击)CSRF(跨站请求伪造) 点击劫持安全性验证与授权用户身份验证授权与权限管理 安全…

“搭载超快闪充、续航自由、天玑8200性能” iQOO Z8系列发布

近日,“天玑 8200 性能小超人”iQOO Z8系列正式发布,包括iQOO Z8和iQOO Z8x两款产品,首销售价1199元起。 “天玑 8200 性能小超人”iQOO Z8倾力打造“最佳千元性能机”:搭载具备巅峰性能的天玑 8200 ,携手满血版LPDDR…

熵 | 无线通信知识

文章目录 一、信息论(熵、联合熵、条件熵)二、Bernoulli熵三、联合熵和条件熵四、互信息五、相对熵(KL距离)常需要的不等式公式 一、信息论(熵、联合熵、条件熵) 熵定义: H ( X ) E [ − l o g 2 p ( x ) ] − ∑ x…

【算法|链表】移除链表元素

算法|链表-移除链表元素 关于链表的介绍以及相关实现操作,见单链表,双链表 leetcode 203 移除链表元素 题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出&#xff1…

Unity3D之动态生成指定数量带间隔的地面

文章目录 准备代码实现实现效果 准备 空物体生成脚本地面预制体 代码实现 using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; using UnityEngine;public class CreateGround : MonoBehaviour {[SerializeField]public i…

多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

多功能透明屏是一种新型的显示技术,它能够在透明的表面上显示图像和视频,并且具有多种功能。 这种屏幕可以应用于各种领域,如商业广告、智能家居、教育等,为用户提供更加便捷和多样化的体验。 首先,多功能透明屏可以…

NIFI关于Parameter Contexts的使用

说明 nifi版本:1.23.2(docker镜像) 作用 Parameter Contexts(参数上下文):参数上下文由 NiFi 实例全局定义/访问。访问策略可以应用于参数上下文,以确定哪些用户可以创建它们。创建后&#x…

CRM系统中的工作流管理及其重要性

工作流是CRM系统中较为常见的功能,它可以有效减少重复工作、提高销售效率。如果您想深入了解,本文就来详细说说,CRM工作流是什么?工作流的作用? 什么是CRM工作流? CRM工作流是指在CRM系统中,根…

Python编程的八大魔法库

Python是一门广受欢迎的编程语言,其生态系统丰富多彩,拥有许多令人惊叹的依赖库,可以帮助程序员们在各种领域中创造出令人瞠目结舌的应用。在这篇文章中,我们将探讨Python编程的十大神奇依赖库,它们像魔法一样&#xf…

3.运行项目

克隆项目 使用安装的git克隆vue2版本的若依项目,博主使用的版本是3.8.6. git clone https://gitee.com/y_project/RuoYi-Vue.git目录结构如下图所示,其中ruoyi-ui是前端的内容,其它均为后端的内容。 配置mysql数据库 在数据库里新建一个…

实体门店如何变“流量”为“存量”门店数字化积分体系如何设计?

随着各行各业特别是实体商家对于数字化工具的广泛使用,积分系统对于实体客户的留存、转化相较于其他营销手段,拥有更好的数据反馈。简单而言,积分指的是在某个平台上流通的虚拟数值,可以辅助平台提升活动运营效果,提升…