JS之Callback function(回撥函式)
阿新 • • 發佈:2018-12-02
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 }