1.stack overflow 上大神的描述(浏览的网页没记住):
A "callback" is any function that is called by another function which takes the first function as a parameter.
2.看了几天的介绍,自己关于回调的简单理解:
1)为了干成某件事,自己建立模块A,然后在A里有一个函数f1负责具体实现某项功能;
2)来自其他地方的模块B已经具备A需要的部分基本功能,B里有个函数 f2(一般为API);
3)A要快(tou)速(lan)实现既定功能,就直接套用B。因此调用 B中的f2 ,同时将f1的地址作为参数传递给了f2;
4)f2在适当时候会调用 f1,这样f1就依托B为基础把事情干成。
5)f1即为回调函数。
3.引用知乎上的例子
1)例子1(作者:Mao Bravo;链接:https://www.zhihu.com/question/19801131/answer/91780287;来源:知乎):
function openFile(filePath,callback){
alert(‘start opening file in‘+filePath);
callback();//when finished,execute callback()
}
function writeToFile(){
alert(‘i‘m now writing file‘);
}
openFile(‘c://test.csv‘,writeToFile);
如果我们在调用openFile 这个例子,我们先会收到 start opening file in c://test.csv ,然后会收到 i‘m now writing file 这不需要你call 它。
在你open file 结束之后就会被自动执行了。
2)例子2(作者:朱栩 链接:https://www.zhihu.com/question/19801131/answer/17312995 来源:知乎)
你去食堂打饭,你喜欢吃小炒热饭菜,所以你去了一个小炒窗口。你跟老板说了要×××盖饭,老板说:你是100号,喊到你的号你就来拿菜。然
后你在旁边跟同学吹牛、或者看手机、或者干点你想干的任何事情。。。然后你听到老板喊100号并且把菜放到窗口,你走到窗口,拿到你的菜。
这里面有几个函数:
老板的部分:
I、老板提供一个点餐的函数 boss.Order(string 菜名,double 钱)
II、老板有个做饭的函数,此函数耗时较长boss.Cook()
III、老板提供一个事件,当boss.cook()执行完时,该事件被触发,boss.OnCookFinish;
你的部分:
I、你需要有一个函数去订餐,也就是你的函数中需要执行类似于boss.Order("红烧肉盖浇饭",20),比如是me.Hungry()
II、你需要有一个函数作为回调函数去关注boss.OnCookFinish事件,这样当老板做好饭,你就可以知道是不是你的好了。
由于老板的事件发生的时候中会喊编号并且吧菜放到窗口,所以你的回调函数需要能够接受1个编号和1个菜作为参数。比如me.AcceptFood(int currNumber,object food)
所以整个程序的流程其实是这样的。
me.Hungry(){
boss.Order("红烧肉盖浇饭",20);
boss.OnCookFinish+=me.AcceptFood;//此处表面,AcceptFood这个回调函数关心OnCookFinish事件,并且变成这个事件的回调函数
//此时这个函数执行完,不再等待
}
boss.Order("红烧肉盖浇饭",20){
//收钱
//配菜 前2个耗时较短
boss.Cook();//此处一般会开新线程执行cook动作
}
boss.Cook(){
//cooking~~~~~~~~~~
//完成了,下面将要触发事件,系统将检查这个事件是否有回调函数关心,有的话逐个回调。
OnCookFinish(100号,红烧肉盖浇饭);
}
至此案例基本完成了一个完整的任务流程。