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 }