回撥函式(CallBack)
1. 定義
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>陣列定義</title>
<script type="text/javascript">
// 先定義一個函式,用來做短時間無法脫身的事情,這時同步
function sdo(does){
console.log(does);
}
// 再定義一個函式,用來做長時間等待,可以脫身的事情,這就是非同步
function ldo(doing){
setTimeout(() => {
console.log(doing);
}, 1000)
}
// 接下來我們要做的事情是這樣子的
sdo('買雞');
sdo('殺雞');
ldo('燉雞');
sdo('吃雞');
</script>
</head>
<body>
</body>
</html>
發現結果異常:
我們使用回撥函式來解決
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>陣列定義</title>
<script type="text/javascript">
// 先定義一個函式,用來做短時間無法脫身的事情,這時同步
function sdo(does){
console.log(does);
}
// 再定義一個函式,用來做長時間等待,可以脫身的事情,這就是非同步
function ldo(doing, callback){
setTimeout(() => {
console.log(doing);
callback('吃雞');
}, 1000)
}
// 接下來我們要做的事情是這樣子的
sdo('買雞');
sdo('殺雞');
ldo('燉雞', sdo);
// 而且最重要的是:可以在燉雞的時間做很多事情
sdo('玩手機');
sdo('看電視');
sdo('思考人生');
</script>
</head>
<body>
</body>
</html>
2. C++ 中的應用
回撥函式是程式設計中的一種設計模式,它允許你將一個函式作為引數傳遞給另一個函式,以便在某個特定的事件或條件下呼叫它。這種模式在處理非同步操作或事件驅動程式設計時非常有用。
#include <iostream>
using namespace std;
// 定義一個回撥函式型別
// 1. void:函式返回型別
// 2. (*CallbackFunction): 宣告一個名為 CallbackFunction 的指標。
// 3. (int): 函式引數列表,這裡的函式接受一個int型別的引數
// typedef是C/C++中的一個關鍵字,用於給一個現有的型別定義一個新的名字。
// 透過typedef,我們可以建立一個更易讀的型別別名。
typedef void (*CallbackFunction)(int); // 定義好函式指標型別後,可以更方便地宣告和使用函式指標:
// 回撥函式
void myCallback(int x) {
cout << "Callback called with value: " << x << endl;
}
// 觸發回撥的函式
void registerCallback(CallbackFunction callback, int value) {
// 模擬一些處理
cout << "Processing..." << endl;
// 呼叫回撥函式
callback(value);
}
int main() {
// 註冊回撥函式
registerCallback(myCallback, 42);
return 0;
}
3. Java 中通常使用介面實現回撥機制
package callback;
// 定義回撥介面
public interface Callback {
void onCallback(String message);
}
package callback;
/**
* @Author: Ronnie LEE
* @Date: 2024/7/19 - 07 - 19 - 0:44
* @Description: callback
* @version: 1.0
*/
public class Main {
public static void main(String[] args) {
new Processor().registerCallback(new MyCall());
}
}
// 實現回撥介面
class MyCall implements Callback{
@Override
public void onCallback(String message) {
System.out.println("Callback called with message: " + message);
}
}
// 觸發回撥的類
class Processor {
public void registerCallback(Callback callback) {
// 模擬一些處理
System.out.println("Processing...");
// 呼叫回撥函式
callback.onCallback("Hello, world!");
}
}