手写Promise源码(一)

大数据架构中的数据血缘追踪技术解析 数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。 阅读详情

写源码前,先看Promise是如何使用的,根据使用的方法,大致推出其设计思想,再一步步来实现。

先来看个最简单的Promise:

let promise = new Promise((resolve, reject) => {
    let flag = true
    if (flag) {
        resolve('成功了')
    } else {
        reject('失败了')
    }
})

promise.then(success => {
    console.log(success)
}, fail => {
    console.log(fail)
})

从上面代码的代码,再结合Promise的基本概念可以看出Promise大概有如下几个特点:

  1. 需要用new来使用,所以它是一个构造函数,这里用类来实现;
  2. 在执行这个类的时候,要传递一个执行器进去,执行器会马上执行,执行器里包含两个方法resolve和reject;
  3. 有三种状态:等待、成功、失败,即一开始为等待状态,然后,要么成功要么失败;
  4. 状态一旦确定就不可再更改;
  5. 状态由执行器中的resolve()和reject()来更改,更改的值直接由此方法传入;
  6. then方法内部判断状态,如果成功就调用成功回调方法返回成功的值,如果失败就调用失败回调方法返回失败的原因。

根据以上6个特点,下面来编码实现。

第一、二步:

class myPromise{
    constructor(execute) {
        execute(this.resolve,this.reject)
    }
    resolve = () => {
        
    }
    reject = () => {
        
    }
}

如上代码,定义了一个类,构造函数里接收一个执行器并马上执行,执行器中的两个方法resolve和reject也已写好,第一步和第二步已经完成。

第三、四步:

const PENDING = 'pending'       // 等待
const RESOLVE = 'resolve'     	// 成功
const REJECT = 'reject'     	// 失败
class myPromise {
    constructor(execute) {
        execute(this.resolve, this.reject)
    }
    status = PENDING    // 状态默认为"等待"
    resolve = () => {
        // 状态为"等待"才执行,确保状态一旦被确定就不可再被更改
        if (this.status === PENDING) {
            this.status = RESOLVE
        }
    }
    reject = () => {
        // 同resolve中逻辑
        if (this.status === PENDING) {
            this.status = REJECT
        }
    }
}

如上代码,新增了"等待"、“成功”、“失败"三种状态,一开始的状态,即默认状态设置为"等待”,随后,要么成功要么失败,由于resolve和reject方法里都做了判断,所以状态被更改后,将无法再被更改,至此,第三、四步已完成。

第五、第六步:

const PENDING = 'pending'       // 等待
const RESOLVE = 'resolve'     	// 成功
const REJECT = 'reject'     	// 失败
class myPromise {
    constructor(execute) {
        execute(this.resolve, this.reject)
    }
    status = PENDING    // 状态,默认"等待"
    value = undefined   // 成功后设置的值,默认undefined
    reason = undefined  // 失败的原因,默认undefined
    resolve = value => {
        // 状态为"等待"才执行,确保状态一旦被确定就不可再被更改
        if (this.status === PENDING) {
            this.status = RESOLVE   // 状态设为成功
            this.value = value      // 存储成功的值
        }
    }
    reject = reason => {
        // 同resolve中逻辑
        if (this.status === PENDING) {
            this.status = REJECT    // 状态设为失败
            this.reason = reason    // 存储失败的原因
        }
    }
    then(successBackcall, failCallback) {
        if (this.status === RESOLVE) {
            // 如果成功,返回成功的值
            successBackcall(this.value)
        } else if (this.status === REJECT) {
            // 如果失败,返回失败的值
            failCallback(this.reason)
        }
    }
}

上面的代码,添加了三个逻辑:

  1. 成功时,由resolve设置状态为resolve,存储成功的值;
  2. 失败时,由reject设置状态为reject,存储成功的值;
  3. 成功时,在成功回调函数里返回成功的值;失败时,在失败回调函数里返回失败的原因。

至此,Promise的最基础部分的源码已手写完成,接下里将会继续完善剩余部分。

文章内容输出来源:拉勾大前端高薪训练营,以上文章中的内容根据老师讲课的语音和代码,结合自己的理解编辑完成。

形式化方法(Formal Methods)和人工智能(Artificial Intelligence) 一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域( 阅读详情

相关推荐

【开源教程25】疯壳·开源编队无人机-定高、定点、悬停

【开源教程25】疯壳·开源编队无人机-定高、定点、悬停

efans_Mike的博客 1652

promise源码详解

promise源码详解

qq_33141245的博客 3460

碳化硅外延层厚度测量:红外干涉光谱与FFT技术详解

薄膜厚度测量是半导体制造中的关键工艺控制环节,其核心原理基于光的干涉现象。当光在薄膜上下界面反射并叠加时,会产生与厚度相关的干涉条纹。通过分析这些条纹,可以非接触、无损地获取薄膜的精确厚度信息。这项技术的核心价值在于实现了对关键工艺参数的在线、快速监控,对于提升器件性能与生产良率至关重要。在第三代半导体,尤其是碳化硅功率器件的制造中,外延层厚度直接决定了器件的击穿电压和导通电阻等核心性能。红外干涉光谱法因其对碳化硅材料在红外波段的良好透过性,成为该领域主流的厚度测量方案。通过快速傅里叶变换(FFT)对采集到

weixin_29032489的博客 309

V8引擎Promise源码全面解读(深度好文)

作者:月夕原文:https://juejin.cn/post/7055202073511460895写在前面的话阅读本文你将收获什么?了解 V8 Promise 源码全过程,世界上不再有能困住你的 Promise 题目,我就是这么肯定这篇文章的干货仅仅了解或者实现了 Promise/A+ 规范,这与 JavaScript 的 Promise 中间还有很大的差距如果你在面试时将 Promise 回答...

前端下午茶 1857

CubeMX配置ADC+DMA避坑实战:如何避免采样过快导致的系统崩溃

本文针对STM32开发中常见的ADC采样过快导致程序卡死问题,提供了基于CubeMX的实战避坑指南。通过分析ADC与DMA协作机制,详解时钟配置、采样时间、DMA缓冲区长度及中断设置等关键步骤,帮助开发者从源头规避系统崩溃风险,实现稳定可靠的数据采集。

weixin_28273593的博客 324

以TMS320F28069为例,如何使用CCS建立DSP工程文件

以TMS320F28069为例,本文主要介绍了使用CCS建立DSP工程的流程

Honglong 2556

Promise源码实现

【代码】Promise源码实现。

weixin_43213911的博客 1016

Ultrascale/Ultrascale+ FPGA GTH IP及结构详解(一)

FPGA GTH Transceiver

houzi6320的博客 1万+

七分钟带你看懂Promise(含源码)

创建两个文件index.htmlpromise.js在promise.js写最基本的promise结构// new调用的时候就会立刻执行同步函数executor// 添加 then 方法index.html里引入 我们刚写的promise.js。

小庄zzz的博客 1405

【软考中级网络工程师】知识点之 ICMP 协议

本文聚焦软考中级网络工程师必备的 ICMP 协议知识,先概述其在 TCP/IP 协议族网络层的地位与无连接特性,再阐述差错报告、网络诊断等功能。解析报文格式,详解差错与查询类报文类型及工作机制,还介绍其在 Ping、Traceroute 命令中的应用,分析常见攻击与防范措施,最后总结核心要点,为网络工程师学习和应用 ICMP 协议提供全面指导。

邓邓子的博客 1405

【Unity实战】实现最完美最简单的UI适配方案,背景压缩或者拉伸变形解决方案,手机刘海屏适配,适配不同分辨率,不同尺寸,不同设备。

这期来讲一个简单的UI设计方案,很多同学可能搞不懂锚点、轴心这些概念,导致做好的UI在别人的设备上,乱跑或者是重叠,或者是参加游戏老发时间比较紧来不及做适配,都可以来试试这个方法,通过填充边框来保持游戏画面的原始比例,所以它的缺点也很明显,在一些移动设备上会浪费比较大的显示面积。 unity不同设备UI变形? UI在不同设备上如何适配?

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3652

Promise基本使用以及手写源码

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。所谓Promise,简单说就是一个容器,等Promise执行完,才会执行里面的东西,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。Promise有以下两个特点。

m0_74079648的博客 1736

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

Promise源码解读(一)-手写一个promise

一个 Promise有以下几种状态: pending: 初始状态,既不是成功,也不是失败状态。 fulfilled: 意味着操作成功完成。 rejected: 意味着操作失败。 我们先实现下面这种效果: new MyPromise(function(resolve,reject){ resolve(123) }).then((v)=>{ console.log(v);//123 }); MyPromise类 class MyPromise(){ static PNEDING='pend

ken_ding的博客 312

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

高阶函数的应用:手写Promise源码(一)

Promise,高阶函数

qiansitong的博客 154

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【手写Promise】史上最最最详细的手写Promise教程

转载自https://yq.aliyun.com/articles/613412 class Promise{ constructor(executor){ this.state = 'pending'; this.value = undefined; this.reason = undefined; this.onResolvedCallbacks = []; this.onRejectedCallbacks = []; let resolve = va

Anles的博客 3769

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

手写Promise,一步步实现自己的Promise

手写promise,一步步实现自己的promise,从零到1实现promise

小时候可呆了的博客 2072

【手写 Promise 源码】目录 - Promise 知识点梳理

本篇,对 Promise 相关知识点进行梳理和拆分;作为Promise 专栏目录,随文章更新会持续完善,欢迎大家留言讨论和补充;

BraveWangDev 1052

手写Promise源码

由于想要更深刻学习promise,翻看了es6官方文档和一些人关于手写promise的一些博客,通过自己的理解手写了promise的一部分功能的源码,加深了自己对promise的理解 目录 1、基本用法 2、基本功能源码 3、then函数源码 4、then函数的链式调用 5、实现then的链式调用的源码 6、promise的状态影响 7、promise状态影响源码 8、完整源码 1、基本用法 构造函数Promise的参数是一个函数,并且该函数有两个参数res和rej分别是Promise

weixin_42756432的博客 535

从基础用法到源码实现:手写 Promise 的完整指南

1. 核心机制链式调用.then()始终返回新Promise,形成独立调用链,避免状态污染。异步优先级:通过微任务队列确保回调执行顺序优先于setTimeout等宏任务。错误冒泡:链式调用中未处理的错误会穿透到最近的.catch(),实现集中捕获。2. 实践挑战建议状态机实现(pendingfulfilledrejected回调队列存储(处理多次调用.then()返回值解析(支持普通值、Promise、thenable对象)循环引用检测(避免导致死锁)3. 巩固练习。

weixin_44840734的博客 1731

面试官:手写个 Promise 给我看看

本文详解如何手写 Promise,帮助前端开发者掌握异步编程核心原理。文章首先通过"煮开水→泡咖啡"的示例对比回调地狱和 Promise 链式调用的区别,说明 Promise 的核心价值。随后提供完整的 Promise 实现代码,包含状态管理、resolve/reject 逻辑和 then 方法实现。重点拆解了 Promise 的 5 个关键步骤:创建 Promise 时初始化状态、定义回调函数、执行异步操作;调用 then 方法时注册回调;以及异步操作完成后触发回调的完整流程。通过生活

前端圈边缘选手,擅长把 UI 稿 “翻译” 成代码,也擅长在 console.log 里写 “求救信号”。日常状态:要么在调像素级对齐,要么在查 “为什么这个样式只在我电脑上生效”。博客不搞高深理论,只唠实在干货~ 979

【源码】手写实现一个Promise

使用typescript实现一个promise

有趣愉悦的学习冒险 1103

Promise详细知识点(内含手写Promise)

promise相关知识和手写promise

ixxoic的博客 1371

方法 手写promise_手写源码系列二——Promise相关方法

欢迎关注微信公众号——“较真的前端”,里面有更多前端面试题和解答。手写Promise相关方法Promise是面试中经常遇到的,如果面试中面试官问你Promise.all()怎么用,那你面试的岗位差不多是高级前端开发的岗位,但如果让你手写一个Promise.all()那你面试的岗位应该就是资深/专家前端开发的岗位了上期回顾上期我们实现了函数的call()、bind()、apply()方法。Promi...

weixin_39611510的博客 127

手写 Promise 源码实现

关乎手写Promise,网上已经有好多相关资料,我也查阅过相关资料,但大多不够全,并且有些没那么易懂,所以自己想从头写个通俗易懂的Promise。 查看完整代码请戳:手写Promise

u011705725的博客 388

手写Promise的思路与源码,看这篇就够了

手写Promise思路与源码思路API的特性与源码构造函数thencatch验证一下Promise.resolvedPromise.rejected未完待续 思路 mdn上搜索Promise,了解类和api的定义: 定义了哪些属性,分别代表什么含义 api需要传什么参数,返回什么值,可能抛出什么异常 看官方给出的用例,猜想内部可能的实现 编写源码,用官方用例验证查看返回值是否一致 API的特性与源码 构造函数 promise有状态pending、rejected和resolved,所以应该有个变量来保

jianghao2016的博客 706
上一篇: history详解
下一篇: JavaScript异步编程(一):同异步执行原理过程
无妄''
博客等级 码龄7年 3粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值