什么是回调函数

需求

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣 | 98. 验证二叉搜索树

98. 验证二叉搜索树 中序遍历 (边遍历边验证顺序性) private TreeNode prev null;private boolean isBST true;public boolean isValidBST(TreeNode root) {inorder(root);return isBST;}private void inorder(TreeNode node) {if (node null) return;inorder(node.left);…

什么是第一方数据,如何使用它?

多年来,第一方数据一直是营销行业的话题。 随着用户数据隐私法律法规的不断收紧,营销人员必须接受一个几乎没有数据 cookie 的世界。 我们必须在如何合法和合乎道德地获取客户信息方面更具创造性。 不确定什么是第一方数据?或者不太确定从…

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C

关于嵌入式开发的一些信息汇总:C标准、芯片架构、编译器、MISRA-C 关于C标准芯片架构是什么?架构对芯片有什么作用?arm架构X86架构mips架构小结 编译器LLVM是什么?前端在干什么?后端在干什么? MISRA C的诞生…

基于JSP+Servlet+Mysql的建设工程监管信息

基于JSPServletMysql的建设工程监管信息 一、系统介绍二、功能展示1.企业信息列表2.录入项目信息3.项目信息列表 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServlet的建设工程监管信息 项目架构:B/S架构 开发语言:…

持续集成交付CICD:Jenkins使用CD流水线下载Nexus制品

目录 一、实验 1.Jenkins使用CD流水线下载Nexus制品 一、实验 1.Jenkins使用CD流水线下载Nexus制品 (1)Jenkins新建CD流水线 (2)新建视图 (3)查看视图 (4)添加字符参数 &#xf…

「Verilog学习笔记」 Johnson Counter

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule JC_counter(input clk ,input rst_n,output reg [3:0] Q );always (posedge clk or negedge rst_n) begin…

Github详细使用教程

1. 什么是 Github? github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。 Github 由Chris Wanstrath, PJ Hyett 与Tom Preston-Werner三位开发者在2008年4月创办。迄今拥有5…

Mybatis-plus介绍与入门

前言 MyBatis-Plus是在MyBatis基础上的一个增强工具库,旨在简化开发者的工作,提高开发效率,同时保留MyBatis的灵活性。使用 MyBatis-Plus 可以减少重复性的代码,简化常见的数据库操作 官方学习文档:MyBatis-Plus (bao…

深度学习 Day16——P5运动鞋识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么?Owner References又是什么?强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时,一直处于Terminating状态。 这是为什么呢? 本文将…

『OPEN3D』1.5.2 动手实现点云栅格/体素最近邻

本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html?spm=1001.2014.3001.5482 NEARBY6实现的voxel可视化 一种NEARBY14实现的可视化voxel

lwIP 细节之五:accept 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。 注:除非特别说明,以下内…

多维时序 | Matlab实现GA-LSTM-Attention遗传算法优化长短期记忆神经网络融合注意力机制多变量时间序列预测

多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | Matlab实…

C#上位机与欧姆龙PLC的通信01----项目背景

最近,【西门庆】作为项目经理负责一个70万的北京项目,需要在工控系统集成软件开发中和欧 姆龙PLC对接,考虑项目现场情况优先想到了采用FinsTCP通讯协议,接下来就是记录如何一步步实现这些通讯过程的,希望给电气工程师&…

鸿蒙app获取文本控件按钮控件_修改控件名称_按钮触发事件_提示信息显示

鸿蒙app获取文本控件按钮控件_修改控件名称_按钮触发事件_ 点击启动:提示信息显示 package com.example.myapplication.slice;import com.example.myapplication.ResourceTable; import ohos.aafwk.ability.AbilitySlice; import ohos.aafwk.content.Intent; impor…

vivado约束方法8

无交互的逻辑互斥时钟组 逻辑排他性时钟是指在不同源点上定义但共享部分的时钟由于多路复用器或其他组合逻辑,它们的时钟树。时间限制向导识别此类时钟,并建议在它们这样做时直接对其进行时钟组约束除了连接到其共享时钟的逻辑之外,彼此之间…

ADUM1200ARZ数字隔离器:重新定义技术标准

ADUM1200ARZ数字隔离器成为技术进步领域的关键组件。其创新设计和多方面功能重新定义了数字隔离技术的格局,提供了满足不同工业需求的众多功能。让我们通过本文直观的了解ADUM1200ARZ的功能与技术标准。 窄体且符合ROHS:设定新基准 该数字隔离器采用窄体…

【ITRA】赛事方收费标准-2024

一、查看ITRA收费情况 1、赛事方 必须注册赛事方的账户进入ITRA 看到的这个100欧,只是一个起步价格,并不是所有价格 不过这个对于一个赛事方可以cover一年的费用 2、更多费用 想当更大的怨种可以 往下拉满

MySQL数据存储、索引记录

行格式(每行记录) 行格式(每行记录): 以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式。 InnoDB 存储引擎4种不同类型的 行格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行格式。组…

Github与Gitlab

学习目标 能够使用GitHub创建远程仓库并使用能够安装部署GitLab服务器能够使用GitLab创建仓库并使用掌握CI/CD的概念掌握蓝绿部署, 滚动更新,灰度发布的概念 GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私…