10張圖讓你徹底理解回調(diào)函數(shù)

大家好,以前寫過一篇關(guān)于回調(diào)函數(shù)的文章C語言函數(shù)指針之回調(diào)函數(shù),今天又安排了一篇。
不知你是不是也有這樣的疑惑,我們?yōu)槭裁葱枰卣{(diào)函數(shù)這個(gè)概念呢?直接調(diào)用函數(shù)不就可以了?回調(diào)函數(shù)到底有什么作用?程序員到底該如何理解回調(diào)函數(shù)?
這篇文章就來為你解答這些問題,讀完這篇文章后你的武器庫將新增一件功能強(qiáng)大的利器。
一切要從這樣的需求說起
調(diào)用make_youtiao() 等待該函數(shù)執(zhí)行完成 該函數(shù)執(zhí)行完后繼續(xù)后續(xù)流程
保存當(dāng)前被執(zhí)行函數(shù)的上下文 開始執(zhí)行make_youtiao()這個(gè)函數(shù) make_youtiao()執(zhí)行完后,控制轉(zhuǎn)回到調(diào)用函數(shù)中

現(xiàn)實(shí)并不容易

為什么我們需要回調(diào)callback
make_youtiao(10000);sell();

make_youtiao(10000, sell);
void make_youtiao(int num, func call_back) {// 制作油條call_back(); //執(zhí)行回調(diào)}
void make_youtiao(int num) {real_make_youtiao(num);sell(); //執(zhí)行回調(diào)}
void make_youtiao(int num) {real_make_youtiao(num);if (Team_B) {sell(); // 執(zhí)行回調(diào)} else if (Team_D) {store(); // 放到倉庫}}
異步回調(diào)
make_youtiao(10000, sell);// make_youtiao函數(shù)返回前什么都做不了

void make_youtiao(int num, func call_back) {real_make_youtiao(num);call_back(); //執(zhí)行回調(diào)}
void make_youtiao(int num, func call_back) {// 在新的線程中執(zhí)行處理邏輯create_thread(real_make_youtiao,num,call_back);}

make_youtiao(10000, sell);// 立刻返回// 執(zhí)行后續(xù)流程
新的編程思維模式
調(diào)用某個(gè)函數(shù),獲取結(jié)果 處理獲取到的結(jié)果
res = request();handle(res);

request(handle);
第一部分是我們來處理的,也就是調(diào)用request之前的部分 第二部分不是我們處理的,而是在其它線程、進(jìn)程、甚至另一個(gè)機(jī)器上處理的。
正式定義
在計(jì)算機(jī)科學(xué)中,回調(diào)函數(shù)是指一段以參數(shù)的形式傳遞給其它代碼的可執(zhí)行代碼。

回調(diào)的類型


回調(diào)對(duì)應(yīng)的編程思維模式
常規(guī)模式:調(diào)用完S服務(wù)后后我去執(zhí)行X任務(wù), 回調(diào)模式:調(diào)用完S服務(wù)后你接著再去執(zhí)行X任務(wù),
為什么異步回調(diào)越來越重要
回調(diào)地獄,callback hell?
a = GetServiceA();b = GetServiceB(a);c = GetServiceC(b);d = GetServiceD(c);
GetServiceA(function(a){GetServiceB(a, function(b){GetServiceC(b, function(c){GetServiceD(c, function(d) {....});});});});
總結(jié)
評(píng)論
圖片
表情
