JS之Callback function(回調函數)


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

回調函數就是一個通過函數指針調用的函數. 如果你把函數的指針(地址)作為參數傳遞給另一個函數, 當這個指針被用為調用它所指向的函數時,我們就說這是回調函數.回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外一方調用的,用於對該事件或條件進行響應.
 回調函數實現的機制是 : 
(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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM