JS之Callback function(回調函數)

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.定義:

回調函數就是一個經過函數指針調用的函數. 若是你把函數的指針(地址)做爲參數傳遞給另外一個函數, 當這個指針被用爲調用它所指向的函數時,咱們就說這是回調函數.回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另一方調用的,用於對該事件或條件進行響應.
 回調函數實現的機制是 : 
(1) 定義一個回調函數;
(2) 提供函數實現的一方在初始化的時候,將回調函數的函數指針註冊給調用者;
(3) 當特定的事件或條件發生的時候,調用者使用函數指針調用回調函數對事件進行處理.
使用回調函數,能夠把調用者與被調用者分開.調用者不關心誰是被調用者,全部它需知道的,只是存在一個具備某種特定原型、某些限制條件(如返回值爲int)的被調用函數.
3.舉例:
         去賓館後,向前臺告知明天六點叫我起牀,這句話說明了兩個Function 1.請求叫醒服務 2.賓館記錄下來到具體時間點叫醒本身。 用代碼實現這裏的邏輯以下:  1.首先須要一個回調函數的接口,雙方的一種約定。  2.Guest和Hotel的實體類,這裏Guest須要Hotel的引用,由於服務是 Hotel提供的。其次開啓一個單獨的線程,來表示雙方各自工做的關係。 一樣Hotel只須要一個具體服務的引用(Callback接口)和具體內容(這裏是時間) 
@1接口:Callback
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 }
相關文章
相關標籤/搜索