1. 程式人生 > >JS之Callback function(回撥函式)

JS之Callback function(回撥函式)

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 }