JS中的回调函数:html
1.概念:程序员
函数a有一个参数,这个参数是个函数b,当函数a执行完之后执行函数b,那么这个过程就叫回调,即把函数做为参数传入到另外一个函数中,这个函数就是所谓的回调函数。ajax
2.举例:编程
某个项目的 A 层和 B 层是由不一样的人员协同完成,A 层负责功能 funA,B 层负责 funcB,当 B 层要用到某个模块的数据,因而他对 A 层人员说,我须要大家提供知足某种需求的数据, 你给我提供一个接口,A 层的人员说: 我给你提供数据,怎么展现和处理则是 B 的事情,固然 B 层不可能为你每一个需求都提供一个数据接口,B 给 A 提供一个经过的接口,B 获得数据,而后 B 写函数去展现。即,你须要和其余人合做,别人提供数据,而你不须要关注别人获取或者构建数据的方式方法。你只要对这个拿到的数据进行操做。这时候就须要使用回调函数,所以,回调本质上是一种设计模式,而且 jQuery(包括其余框架)的设计原则遵循了这个模式。设计模式
@1:一个同步(阻塞)中使用回调的例子,目的是在 func1 代码执行完成后执行 func2。框架
1 var func1=function(callback){ 2 3 //do something. 4 5 (callback && typeof(callback) === "function") && callback(); 6 7 } 8 func1(func2); 9 10 var func2=function(){ 11 12 }
@2:异步回调的例子:异步
1 $(document).ready(callback); 2 $.ajax({ 3 4 url: "test.html", 5 6 context: document.body 7 8 }).done(function() { 9 10 $(this).addClass("done"); 11 12 }).fail(function() { 13 14 alert("error"); 15 16 }).always(function() { 17 18 alert("complete"); 19 20 });
下面的比喻很生动有趣:编程语言
你有事去隔壁寝室找同窗,发现人不在,你怎么办呢?ide
方法 1,每隔几分钟再去趟隔壁寝室,看人在不函数
方法 2,拜托与他同寝室的人,看到他回来时叫一下你
前者是轮询,后者是回调。
C++中的回调函数
1.概念:
从概念上讲,回调函数与普通函数的本质在于:调用者的不一样。普通函数由程序员代码调用,而回调函数由操做系统在适当的时间调用。
回调函数主要用于处各类事件和处理。因为WINDOWS系统中存在大量程序员事先不可知的事件,例如鼠标的单击,程序员事先没法得知终端用户什么时候会发出此动做,所以只能:
A定义事件的处理逻辑,与普通函数的编程同样;
B告之操做系统本身的处理逻辑,即通知操做系统函数指针;VC/VB等现代编程语言经过事件编程机制隐藏了这一步;
C操做系统在事件出现时,调用指定的函数(回调函数的概念)处理,这一步彻底由系统负责。
回调函数在各类操做系统中广泛存在,是现代操做系统为程序员提供处理异步事件的基本机制之一,在不一样的系统中的具体实现方式各不相同;请参阅随机文档Callback 函数实质就是你实现这个函数,由操做系统调用。而通常的状况下是,操做系统提供函数由你来调用的。回调函数实际上就起到了消息循环的做用,由于在sdk中只有经过回调函数来发送各自的处理消息
2.定义:
package com.callback.demo; public interface Callback { public void callback(String result); }
@2具体实现类Guest
1 package com.callback.demo; 2 3 public class Guest implements Callback { 4 Hotel hotel; 5 public Guest(Hotel hotel) { 6 this.hotel=hotel; 7 } 8 //客人的告诉宾馆叫醒服务(时间) 9 public void awake(String date ) { 10 System.out.println("走到前台。。。要求服务"); 11 //宾馆登记 12 new Thread(new Runnable() { 13 14 @Override 15 public void run() { 16 // TODO Auto-generated method stub 17 hotel.recordAndWake(Guest.this, date); 18 } 19 20 }) { 21 22 }.start(); 23 //等待服务办理 24 System.out.println("等待服务办理"); 25 try { 26 Thread.sleep(1000); 27 } catch (InterruptedException e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 } 31 doOtherThing(); 32 33 } 34 //长夜慢慢 无意睡眠 35 void doOtherThing() { 36 System.out.println("吃吃宵夜"); 37 System.out.println("睡觉了,等待叫醒"); 38 } 39 40 @Override 41 public void callback(String result) { 42 // TODO Auto-generated method stub 43 System.out.println("hotel=============叫醒服务"+result); 44 } 45 46 }
Hotel
1 package com.callback.demo; 2 3 public class Hotel { 4 //提供的服务 须要服务对象 以及服务内容 5 public void recordAndWake(Callback callback,String date) { 6 System.out.println("hotel记录时间为====="+date); 7 //模拟长夜慢慢 8 try { 9 Thread.sleep(5000); 10 } catch (InterruptedException e) { 11 // TODO Auto-generated catch block 12 e.printStackTrace(); 13 } 14 15 16 date="时间到了。。。。客人"; 17 callback.callback(date); 18 } 19 }
test
1 package com.callback.demo; 2 3 public class TestCase { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 Hotel hotel = new Hotel(); 8 Guest guest = new Guest(hotel); 9 guest.awake("明天早上6.00"); 10 11 } 12 13 }