回撥函式(CallBack)

爱新觉罗LQ發表於2024-07-19

回撥函式(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!");
    }
}

相關文章