JS中的回調函數:
1.概念:
函數a有一個參數,這個參數是個函數b,當函數a執行完以后執行函數b,那么這個過程就叫回調,即把函數作為參數傳入到另一個函數中,這個函數就是所謂的回調函數。
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 });
下面的比喻很生動有趣:
你有事去隔壁寢室找同學,發現人不在,你怎么辦呢?
方法 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 }