什么是回调函数

news2024/11/28 14:50:21

需求

A,B两个小组开发一个功能。B小组开发制作油条模块:make_youtiao。A小组需要调用B小组开发的模块,然后执行后续的操作:sell()如下图:

请添加图片描述

上面的方式A小组必须等待B小组开发的模块make_youtiao执行完成后才能执行sell()。

上图代码的写法:

make_youtiao(10000);
sell();

在这里插入图片描述

存在的问题:A小组不知道啥时候B小组执行完,因此必须等待B小组执行完,再执行后续的操作sell(),效率不够高。

要是A能够告诉B小组,你执行完make_youtiao后自动执行sell()就好了!我把任务交给你之后就去做其他事情啦~

在这里插入图片描述

看懂了?回调函数就是上面的sell()函数,不过他要作为参数传递给B小组。

上面功能用回调函数实现

B小组开发的模块这样定义:

void make_youtiao(int num, func call_back) {
    // 制作油条
    do_youtiao();
    call_back(); //执行回调 
}

A小组这样调用,将make_youtiao完成后和make_youtiao相关的工作sell作为参数传入:

make_youtiao(10000, sell);

新的编程思维模式

同步的思维方式:

res = request();
handle(res);

这种是必须等待执行完,拿到结果res,我们才能处理下一步和结果相关的工作handle()。

在这里插入图片描述

异步的思维方式:

request(handle);

这种方式不关心request何时执行完,将后续的工作handle传入request,当request执行完了,自动就把handle处理了。

3e2ceb4b054ae956c7422547a76ff660_720w.webp&pos_id=img-wrrhxyoc-1702705329186)

举个例子说明同步和异步的区别:

同步:老板凡事亲力亲为,自己亲自拨电话等待电话接通(request)。然后吩咐事情(handle)。

异步:老板直接告诉小秘吩咐的事情是什么,小秘去完成这些琐事。老板就可以腾出手来完成一个亿的小目标啦~

正式定义

在计算机科学中,回调函数是指一段以参数的形式传递给其它代码的可执行代码。可以理解为一种设计思想。

一般函数:我们自己编写的函数在自己内部调用,实现方是我们自己,调用方是我们自己。

回调函数:实现方是我们自己,将函数传给第三方,由三方库来调用。实现方是我们自己,调用方是第三方库。

进一步思考为什么需要callback?

我们之所以要传给第三方库自己定义的函数,是因为第三方库自己的代码执行完成之后,并不知道接下来应该做什么,因此对外提供了一个回调函数(跟对外提供一个接口有点类似,由调用方来具体实现)

最后补充一点是:回调函数被调用的时间点,是需要有特定的事件(event)发生后,才能执行回调函数。比如油条制作完成,文件读取完成,接收到消息。因此回调函数本质上是一个event_handler。

参考链接

https://zhuanlan.zhihu.com/p/326902537

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

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

相关文章

JVM-2-对象

对象创建 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 为对象分配空间…

linux性能优化-cpu使用率

文章目录 1.CPU使用率2.节拍率的概念2.1.查看系统节拍率2.2.用户节拍率2.3.CPU使用率公式 3.怎么查看CPU使用率3.1.top显示系统总体CPU使用情况3.2.pidstat分析每个进程CPU使用情况 4.CPU使用率过高怎么办4.1.perf命令详解 1.CPU使用率 用什么指标来描述系统的CPU性能呢?不是…

SpringData JPA 整合Springboot

1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…

Oracle 透明网关安装

Oracle 11g透明网关连接Sqlserver oracle 透明网关是oracle连接异构数据库提供的一种技术。通过Gateway&#xff0c;可以在Oracle里透明的访问其他不同的数据库&#xff0c;如SQL Server, DB2, Sybase等等&#xff0c;就像远程Oracle数据库一样。配置后的sql查询的处理流程&…

架构设计系列之基础设施能力建设

周末聊两句&#xff1a; 今天将的基础设施能力建设部分&#xff0c;一般的架构书籍中都不存在的部分&#xff0c;这是我在实践过程中的经验和能力总结部分&#xff0c;希望和大家有一个很好的交流自从在 WeChat 中开了订阅号的两周半的时间&#xff0c;非常感谢大家的支持&…

Spring Boot 3 整合 Hutool 验证码实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

中通单号查询,中通快递物流查询,对需要的单号进行备注

批量查询中通快递单号的物流信息&#xff0c;对需要的单号进行备注。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左上角的“…

vite原理

一、依赖预构建 1、为什么需要依赖预构建 CommonJS和UMD兼容性 在开发阶段中&#xff0c;vite的开发服务器将所有的代码视为原生ES模块。因此&#xff0c;vite必须先将作为CommonJS或者UMD发布的依赖项转换为ESM。 这是vite的一个特色&#xff0c;也是为什么会相对于webpack比…

ffmpeg6.0-ffplay.c源码分析(二)之整体框架大流程分析

文章目录 main()函数解读stream_open()函数解析event_loop函数解析关注公众号看全文: 想分析任何一个可执行程序,肯定从main()函数下手是比较合适的,ffplay的源代码也是如此。 main()函数解读 /* Called from the main */ int main(int argc, char **argv)

训练属于自己的大模型LM Studio使用记录

LM Studio 支持本地运营大模型 下载地址: https://lmstudio.ai/ 一 搜索下载管理 安装之后打开, 搜索对应大模型, 下载, 举例: baichuan 点击左侧菜单栏文件夹图标进行管理 二 聊天 点击左侧菜单栏聊天图标, 新建聊天, 输入框输入内容 可能对回答的结果并不满意, 我们可以…

实战经验:如何利用房产小程序提升客户满意度?

在当今的数字化时代&#xff0c;房产中介公司需要不断地适应市场变化&#xff0c;提供更加便捷、高效的服务。小程序作为一种轻量级的应用程序&#xff0c;具有无需下载、易于分享、随时可用等优点&#xff0c;可以为房产中介公司提供一个新的销售渠道。本文将介绍如何使用乔拓…

教师如何维护学生的自尊心

作为教师&#xff0c;我们不仅要传授知识&#xff0c;更要关心学生的身心健康&#xff0c;特别是他们的自尊心。自尊心是个人自我价值的重要体现&#xff0c;对学生的学习、生活和未来的发展都有深远的影响。因此&#xff0c;维护学生的自尊心是教师的重要责任。 教师要尊重每…

usart串口以及通信基本概念

文章目录 通讯的基本概念串行通信与并行通讯串行通信并行通信两种通信方式的比较 全双工、半双工及单工通讯概念**模型图** 同步通讯与异步通讯模型图同步通讯模型图异步通讯模型图 通讯速率比特率 (Bitrate) &#xff1a;波特率”(Baudrate)&#xff1a; USART——串口通讯串口…

CMA、CNAS软件检测公司分享:压力测试应关注的指标和面临的问题

软件压力测试是容易被传统企业忽视的测试点&#xff0c;用户人数一旦超过预期&#xff0c;极易造成软件产品卡顿、崩溃的情况&#xff0c;不利于用户正常使用&#xff0c;严重影响企业公信力和盈利水平。今天卓码软件测评小编来聊聊压力测试过程中应该关注的指标和会面临的问题…

k8s - container

1、容器的生命周期&#xff1a; (1) 简介&#xff1a; Kubernetes 会跟踪 Pod 中每个容器的状态&#xff0c;就像它跟踪 Pod 总体上的阶段一样。 可以使用容器生命周期回调&#xff0c;在容器生命周期中的特定状态点触发事件。 ● 容器生命周期回调&#xff1a; 在容器的生…

HTML5+CSS3+JS小实例:可拖拽排序的人物列表

实例:可拖拽排序的人物列表 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

设计模式详解---单例模式

1. 设计模式详解 单例模式是一种创建对象的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点以获取该实例。 在单例模式中&#xff0c;类负责创建自己的唯一实例&#xff0c;并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…

力扣刷题-二叉树-路径总和

112 路径总和 给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 返回 true, 因为…

2024中国国际大数据产业博览会年度主题征集公告

2024中国国际大数据产业博览会年度主题征集公告 中国国际大数据产业博览会&#xff08;以下简称数博会&#xff09;&#xff0c;是全球首个以大数据为主题的国家级博览会&#xff0c;由国家发展和改革委员会、工业和信息化部、国家互联网信息办公室和贵州省人民政府共同主办&am…

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制&#xff0c;但手动编写Parcela…