不知道你是否有这样的疑问,我们为什么需要回调函数,直接调用函数不就可以了吗?回调函数到底有什么用?程序员该如何理解回调函数了?
这篇文章就为你解答这些问题,读完这篇文章后,你的编程技术将得到质的提高。
做一件事情,程序员传统并且最熟悉思维模式一般是这样:
result = request()
handles(result)
如果 request()函数是同步调用,只有request()函数返回拿到结果后,才能调用handle函数进行处理,request()函数返回前我们必须等待,这就是同步调用,控制流程就是这样的

但是如果我们想更加高效的话,那么就需要异步调用了,我们不去直接调用handle函数,而是作为参数传递给 request()
request(handle)
所以,我们根本不关心request什么时候真正的获取结果,这是request该关心的事情,我们只需要把获取到的结果,该怎么处理告诉request就可以了,因此 request函数可以立即返回,真正获取结果是可能在另一个线程,进程,甚至另一台机器上完成,这就是异步调用。
从编程思维上看,异步调用和同步有很大的差别,如果我们把处理流程当做一个任务来的话,那么同步流程下,整个任务都是我们实现的,但是异步流程情况下:任务的处理流程被分为两部分:
重点来了:
第二部分的调用不在我们控制范围内,同时只有调用方才知道该做什么,什么时候调用,因此在这种情况下,就需要一种必要的机制-------》这个机制就是回调。
回调函数就是一个函数和其他函数没有任何区别。
一般函数:我们自己编写函数会在自己的程序内调用,也就是说函数的编写放方式我们自己,调用方也是我们自己
回调函数:编写方是我们自己,但是函数调用方不是我们,而是我们引用的其他模块,也就是三方库,我们调用第三方库中的函数,并把回调函数传递给第三方库,第三方库中的函数调用我们编写的函数。



这就是所谓的异步回调,asynchronous callbacks ,也有资料称为 deferred callbacks ,名字很形象,延迟回调。
回调函数步骤:
1、定义一个函数(普通函数即可);
2、将此函数的地址注册给调用者;
3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。
- // main.cpp
-
-
- #include
- // 定义一个函数指针:返回值 int ,需要两个int 类型参数
- typedef int (*Ptr)(int, int);
-
- // 2:注册函数
- int RegFuncation_add(Ptr pInt, int a, int b) {
- // 调用回调函数
- return pInt(a,b);
- }
-
- class OperMath
- {
- public:
- // 1: 回调函数
- static int add(int a, int b) {
- return a + b;
- }
-
- // 1: 回调函数
- static int reduce(int a, int b) {
- return a - b;
- }
-
- // 3: 注册函数
- void RegFuncationCallBack_add(int a, int b) {
- std::cout << RegFuncation_add(add, a, b) << std::endl;
- }
-
- // 3: 注册函数
- void RegFuncationCallBack_reduce(int a,int b) {
- std::cout << RegFuncation_add(reduce, a, b) << std::endl;
- }
- };
-
-
- int main() {
- OperMath math;
- math.RegFuncationCallBack_add(1, 2); // 打印:3
- math.RegFuncationCallBack_reduce(2, 1); // 打印:1
- }