首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

模拟实现 Promise(小白版)

从代码角度来看的话,无非也就是一些变量、函数,所以,我们就可以来针对各个功能点,思考下,都需要哪些代码: 变量上至少需要:三种状态、当前状态(_status)、传递给回调函数的结果值(_value)...第二步:构造函数 Promise 的构造函数做的事,其实很简单,就是马上执行传入的 task 处理函数,并将自己内部提供的两个状态变更处理的函数传递给 task,同时将当前 promise 状态置为...所以这个状态变更需要支持当值类型是 Promise 时的异步等待处理,这条异步任务链才能得到预期的执行效果 当你们去看规范,或看规范的中文版翻译,其实有关于这个的更详细处理说明,比如开头给的链接的那篇文章里有专门一个模块...// 测试当 Promise rejectd 时,reject 的状态结果会一直传递到可以处理这个失败结果的那个 then 的回调中 new Promise((r, j) => { j(1);...你可以将代码贴到浏览器上,然后自己测试下这些用例,跟官方的 Promise 执行结果比对下,你就可以知道,你实现的 Promise 基本功能上有没有问题了 当然,需要更全面的测试的话,还是得借助一些测试库

1.4K20

gin框架常用模块

这种写法适用于定义一个具体的变量,可以直接使用该变量进行赋值、传参等操作。...这种写法适用于定义一个指针变量,需要在后续的代码中通过new()函数或其他方式对它进行初始化,才能使用该指针变量进行赋值、传参等操作。 在后续传参时,两种写法的区别在于传递的值的类型不同。...例如,可以通过&res获取res变量的地址,然后将地址作为参数传递给需要的函数或方法。在函数或方法内部,可以通过*res获取指针指向的实际数据. 那么什么时候用第一种,什么时候用第二种呢?...一般来说,使用第一种写法 p := mconfig.CoursewareParam{} 适用于定义一个具体的变量,该变量的类型是已知的,可以直接进行赋值、传参等操作。这种写法比较简洁,代码可读性较高。...使用第二种写法 var res *dao.BpCourseware 适用于定义一个指针变量,该变量需要在后续的代码中进行初始化,才能使用它进行赋值、传参等操作。

27220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解指针(2)

    我们发现在main函数内部,创建了a和b,a的地址是0x00cffdd0,b的地址是0x00cffdc4,在调用 Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收...Swap1函数在使用的时候,是把变量本⾝直接传递给了函数,这种调⽤函数的⽅式我们之前在函数的时候就知道了,这 种叫传值调用。...结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实 参。 所以Swap1是失败的了。...我们可以看到实现成Swap2的方式,顺利完成了任务,这⾥调用Swap2函数的时候是将变量的地址传 递给了函数,这种函数调用方式叫:传址调用。...传址调用,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调用。

    10210

    【C语言】传值调用与传址调用详解

    示例代码:传值调用失败的情况 假设我们有一个函数 Swap,用于交换两个整数的值。...为什么传值调用无法修改外部变量? 传值调用的核心问题是,它将参数的副本传递给函数,而不是变量本身。这意味着函数对副本所做的任何修改都不会影响外部变量。...与传值调用不同,传址调用会将变量的地址传递给函数,这样函数就能够直接修改原始变量的值。在传址调用中,传递的是变量的指针,函数通过指针访问并修改原始变量的内容。 2....传值调用与传址调用的应用场景 传值调用:当函数不需要修改传入的参数,或者当参数是小型数据(如整数、浮点数等)时,传值调用是最常见且安全的选择。...传值调用将参数的副本传递给函数,适用于不需要修改外部变量的情况。 传址调用则通过传递地址,使得函数能够直接修改外部变量,适用于需要修改变量的场景,尤其是在处理大数据时更为高效。

    11310

    Python中函数的介绍

    命名规范可参考官网的PEP 8风格,地址如下: https://peps.python.org/pep-0008/#function-and-variable-names 参数:参数是函数定义中用于接收输入值的变量...在调用函数时,可以向函数传递实际的参数值,这些值将被赋给函数定义中对应的参数变量。 返回值:返回值是函数执行完成后返回给调用者的结果。...add的x和y,按照顺序,3将赋值给变量x,5将赋值给变量y。...特点:按照函数定义时参数的顺序去进行赋值。 关键字参数 关键字参数是以"参数名=值"的形式传递给函数的参数。使用关键字参数时,可以不按照参数定义的顺序传递参数值,而是通过参数名进行匹配。...说明: 传值的时候需要传键值对,如果要传dict需要在前面加上**,表示将这个dict的所有key-value当成独立的关键字参数(变成 key = value)传入到 kwargs●不用 dict

    17740

    八、python学习笔记-面向对象-类对象

    对象包括两个数据成员(类变量和实例变量)和方法 """类对象 需要知道的是self代指实例,cls代指类,这是python中定义好的规范 变量(字段): 1、实例变量(普通字段):实例变量属于实例...1、实例变量:如果对象中保存一些值,执行某个功能时需要使用对象中的值,使用实例变量 2、类变量:不需要任何对象中的值,但是一个或多个方法需要使用的值,使用类变量 """ class Province:...) # 不会报错,类变量可以直接被类调用 print(Province.country) """类的方法 1、普通方法:如果对象中保存一些值,执行某个功能时需要使用对象中的值,使用实例变量 2、静态方法...(foo)传递给self # 通过类调用,并未执行构造方法,说明没有创建实例,直接调用bar打印hello # 通过类调用需要传参,因为定义方法时设置了形参self,没有创建实例需要自己传入 Foo1...def bar(cls): # 类方法使用cls而非self,必填.cls代指类,所以不需要实例 print('classmethod') Foo3.bar() # 会自动将类传递给形参

    71331

    前端高频手写面试题

    => 递归递归退出条件:被比较的是两个值类型变量,直接用“===”判断被比较的两个变量之一为null,直接判断另一个元素是否也为null提前结束递推:两个变量keys数量不同传入的两个参数是同一个变量递推工作...时 将订阅函数进行执行(发布) */ // 成功队列 this.onResolvedCallbacks = [] // 失败队列 this.onRejectedCallbacks...他们的结果返回(普通值)会传递给外层的下一个then中 * 2、可以在成功或失败中抛出异常,走到下一次then的失败中 * 3、返回的是一个promsie,那么会用这个promise的状态作为结果,会用...promise是否规范// 全局安装 cnpm i -g promises-aplus-tests// 命令行执行 promises-aplus-tests promise.js// 测试入口 产生延迟对象...// 当作为普通函数时,this 指向 window,此时结果为 false,将绑定函数的 this 指向 context return self.apply( this instanceof

    1.2K20

    带你写出符合PromiseA+规范Promise的源码

    我的建议是,对照规范多写几次实现,也许第一遍的时候,是改了多次,才能通过测试,那么需要反复的写,我已经将Promise的源码实现写了不下七遍,不那么聪明的话,当然需要更加努力啦~ ?...如果 then 中抛出了异常,那么就会把这个异常作为参数,传递给下一个then的失败的回调(onRejected) * 11.如果 then 返回的是一个promise,那么会等这个promise执行完...value 是promise状态成功时的值,包括 undefined/thenable或者是 promise exception 是一个使用throw抛出的异常值 reason 是promise状态失败时的值...并且会将值原封不动的传递给后面的then....它可以是完成( resolves),也可以是失败(rejects),这要取决于第一个完成的方式是两个中的哪个。 如果传的参数数组是空,则返回的 promise 将永远等待。

    87220

    【C语言】指针进阶之传值调用与传址调用

    ✔在编程语言如C中,传值调用和传址调用是用来传递参数给函数的方法。它们的主要区别在于参数传递的方式: ☞传值调用:这是最基本的参数传递方式,它涉及将参数的值复制一份传递给函数。...☞传址调用:这种方式则是将参数的地址传递给函数。这样做的目的是让函数能够直接访问到传入的参数,并且可以对这些地址指向的数据进行修改。...这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫传值调⽤。 结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实 参。 所以Swap是失败的了。 那怎么办呢?... printf("交换后:a=%d b=%d\n", a, b);  return 0; } ⾸先看输出结果:  我们可以看到实现成Swap2的⽅式,顺利完成了任务,这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数...如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。

    14210

    Java设计模式(十七)----责任链模式

    二、引子 从击鼓传花谈起   击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。...开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。   比如说,贾母、贾赦、贾政、贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链。...击鼓者将花传给贾母,开始传花游戏。花由贾母传给 贾赦,由贾赦传给贾政,由贾政传给贾宝玉,又贾宝玉传给贾环,由贾环传回给贾母,如此往复,如下图所示。当鼓声停止时,手中有花的人就得执行酒令。 ?...上图中Handler类的聚合关系给出了具体子类对下家的 引用,抽象方法handleRequest()规范了子类处理请求的操作。   ...然后客户端将请求传递给第一个处理者对象。   由于本示例的传递逻辑非常简单:只要有下家,就传给下家处理;如果没有下家,就自行处理。因此,第一个处理者对象接到请求后,会将请求传递给第二个处理者对象。

    1.3K90

    必知的 Vue3 组件传值技巧:解锁组件交互新姿势

    父传子defineProps 基本概念 在 Vue 3 中,父传子是一种组件间通信的方式,用于将父组件的数据传递给子组件。这种通信方式可以让组件之间更好地协作,实现功能的复用和模块的划分。...然后,将props里面的属性值赋值给propsWeb变量,这样就可以在子组件的模板中使用propsWeb来显示父组件传递过来的数据了。...例如,父组件中有一个按钮,点击按钮可以改变传递给子组件的数据。 当点击按钮时,count的值会改变,这个变化会自动传递给子组件,子组件会根据新的数据进行更新。...子传父defineEmits 基本概念 在 Vue 3 中,子传父是组件间通信的重要方式。它允许子组件将数据或事件传递给父组件,从而实现组件之间的反向通信,这在构建复杂的应用程序结构时非常有用。...注意事项 父组件在监听子组件事件时,方法名要正确匹配。如果方法名拼写错误或者没有正确定义,那么在子组件触发事件时,父组件将无法正确接收和处理数据。

    44730

    Python - pydantic 入门介绍与 Models 的简单使用

    定义数据应该如何在规范的 python 代码中保存,然后通过 Python 验证它 Pydantic 安装 pip install pydantic 测试 pydantic 是否已编译 import...Models 简介 在 pydantic 中定义对象的主要方法是通过模型(模型是从 BaseModel 继承的类) 所有基于 pydantic 的数据类型本质上都是一个 BaseModel 类 可以将模型视为强类型语言中的类型...(比如 Java) 不受信任的数据可以传递给模型,经过解析和验证后,pydantic 保证生成的模型实例的字段将符合定义的字段类型(实例字段类型符合类定义的字段类型) 基础模型使用 from pydantic...属性) id,整数 int 类型,是必传的 name,字符串 string 类型,不是必传,有默认值 为什么能知道 name 是 string 类型?... id 属性传的是字符串 '123',它会根据模型字段类型进行转换为 int name 属性取了默认值 __fields_set__ 该变量返回用户初始化对象时提供了什么字段

    2.6K30

    Oracle数据库学习笔记 (六 —— 开发子程序和包)

    在调用过程之前需要通过变量给该种参数传递数据,调用结束后,Oracle会通过该变量将过程结果传递给应用 alter table dept1 add(level1 number(2)); -- 给 dept1...,最终通过执行函数可以将结果返回到应用程序中 当定义参数时,如果不指定参数模式,则默认为输入参数 -- 创建函数 create or replace function fun_getrandom return...当创建包时,需要首先创建包规范,然后再创建包体 注意: 包规范下你跟对接口 包体相当于接口的实现 4.2 创建包规范 包规范是包与应用程序之间的接口,用于定义包的公用组件,包括常量、变量、游标、过程和函数...在包规范中所定义的公用组件不仅可以在包内引用,而且还可以由其他的子程序引用 创建包规范时需要注意的是:为了实现信息隐藏,不应该将所有组件全部放在包规范处定义,而应该只定义公用组件 语法: create...、过程、函数 当在其他应用中调用包的公用变量时,必须在公用变量、过程、函数名前添加包名作为前缀 调用包 declare area number(10,7); begin area:=dbutil_package.getarea

    56430

    C语言作业详解12_17(题型对应知识点)

    实参可以为常量、变量和表达式,无论是哪个只要可以向形参传值都可以。 B、错误。形参不能为表达式,在C语言中,形参可以是变量或指针,但不能是常量或表达式。形参用于接收函数调用中传递的实际参数的值。...函数调用虽然不能直接作为一个函数的形参,但可以定义函数指针作为形参,然后将函数调用通过函数指针传递给该形参。 五、函数命名 A、错误。...不符合C语言的语法规范 六、传参方式 A. 地址传递:地址传递是指将实参的地址传递给形参,形参通过该地址可以直接访问和修改实参的值。在C语言中,可以通过传递指针来实现地址传递。...然后,调用了 fun(x, y, z) 函数,将变量 x、y、z 的值传递给函数的对应形参。...只有当时参合形参同名时才占用一个内存单元 D. 形参时虚拟的,不占用内存单元 在C语言中,每当调用函数时,实参的值会被复制一份传递给函数的形参,形参在函数内部使用的是这个副本。

    12410

    手写一个Promiseu002FA+,完美通过官方872个测试用例

    实现之后,我们还要用Promise/A+官方的测试工具来测试下我们的实现是否正确,这个工具总共有872个测试用例,全部通过才算是符合Promise/A+规范,下面是他们的链接: Promise/A+规范...我们new Promise(fn)的时候需要传一个函数进去,说明Promise的参数是一个函数 构造函数传进去的fn会收到resolve和reject两个函数,用来表示Promise成功和失败,说明构造函数里面还需要...function reject(reason) { if(that.status === PENDING) { // ...省略其他代码... // resolve里面将所有失败的回调拿出来执行...Promise.reject方法的参数reason,会被传递给实例的回调函数。...那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

    28810

    手写一个PromiseA+,完美通过官方872个测试用例

    实现之后,我们还要用Promise/A+官方的测试工具来测试下我们的实现是否正确,这个工具总共有872个测试用例,全部通过才算是符合Promise/A+规范,下面是他们的链接: Promise/A+规范...我们new Promise(fn)的时候需要传一个函数进去,说明Promise的参数是一个函数 构造函数传进去的fn会收到resolve和reject两个函数,用来表示Promise成功和失败,说明构造函数里面还需要...function reject(reason) { if(that.status === PENDING) { // ...省略其他代码... // resolve里面将所有失败的回调拿出来执行...Promise.reject方法的参数reason,会被传递给实例的回调函数。...那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

    74761

    阿里前端二面经典手写面试题汇总_2023-02-27

    /** * 同一个promise可以then多次(发布订阅模式) * 调用then时 当前状态是等待态,需要将当前成功或失败的回调存放起来(订阅) * 调用resolve...时 将订阅函数进行执行(发布) */ // 成功队列 this.onResolvedCallbacks = [] // 失败队列 this.onRejectedCallbacks...他们的结果返回(普通值)会传递给外层的下一个then中 * 2、可以在成功或失败中抛出异常,走到下一次then的失败中 * 3、返回的是一个promsie,那么会用这个promise的状态作为结果...promise是否规范 // 全局安装 cnpm i -g promises-aplus-tests // 命令行执行 promises-aplus-tests promise.js // 测试入口 产生延迟对象...=> 递归 递归退出条件: 被比较的是两个值类型变量,直接用“===”判断 被比较的两个变量之一为null,直接判断另一个元素是否也为null 提前结束递推: 两个变量keys数量不同 传入的两个参数是同一个变量

    61410

    C语言中指针的说明

    a=10所代表的地址,并且每一个字节都是代表着地址 下面我们将通过&(取地址操作符来得到a的地址) 这边显示的结果是同上面通过内存调试出来的结果是相同的 这里我们通过&符号将a的地址存储到指针变量p ...⼩⼼指针越界 3.指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性 4.避免返回局部变量的地址 assert断言包含在assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件...所以Swap1是失败的了。...); printf("交换后:a=%d b=%d\n", a, b); return 0; } 我们可以看到实现成Swap2的⽅式,顺利完成了任务,这⾥调⽤Swap2函数的时候是将变量的地址传...递给了函数,这种函数调用方式叫:传址调用。

    8010

    过程(四)传地址和传值

    在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。 由于概念生硬不易理解,还是先说示例,再总结介绍。...然后调用jisuan过程,将变量b作为实参按地址传递给变量a,进行计算a=a+1。此时再在立即窗口中显示变量b,就会发现它已经经过计算变成了3。...这是因为在调用过程时,将变量b做实参按地址传递给变量a,变量b和变量a指向同一个内存单元,一起变化。...2、当形参定义为ByRef形式时,只有当实参为一个变量时,才能按地址方式传递参数,如果实参是一个表达式或者常量,则不能按传地址方式传递。 二、 传 值 传值是将实参的值作为一个副本,赋值给形参。...在jisuan过程,ByVal a As Integer为按值将实参传递给形参。 在diaoyong过程,先定义了整型变量b,给b赋初始值为2。

    5K30
    领券