方函式似乎正要解釋所謂的回呼函式
方函式:鄭列的能力啊,是很不錯,但是啊... 有些事情重視的就不是什麼多會整理、尋找,而是優先順序。
我:這又是什麼工具人感慨嗎?
方函式:你看麻,工具歸工具,但他也有自己的事情要處理,總會有比較忙的時候,隨便舉個例子
假設今天你要處理:JS的雜事doSomethingJSwant()
跟你自己的事情doYourOWnThing()
//她要求你幫忙的事
function doSomethingJSwant(){
buyFruits();
buyTools();
walkHerDog();
}
//你自己的事
function doYourOWnThing(){
work();
}
一看就知道,要幫她處理的事情會花較久時間,但如果你把自己的事情擺前面,這樣她不生氣才怪,而且也沒看過這樣的工具人吧(信仰不足),所以就只能妥協(?):
理想工具人的處理順序表示圖:
buySomethingJSwant();
doYourOWnThing();
還不懂回呼函式又虔誠的你,自然只能接受上面的情境
但難道要這樣一直跟效率妥協嗎?你需要知道同步與非同步的概念(之後再說)
但不是每件事情所花費的時間,都是能控制的:
今天,JS請你幫她做:洗狗washDog()
、她來電時去接她pickHerUp()
、幫忙採買雜貨buyGroceries()
,而且她要求你,接到她的時候,就要帶著洗好的狗跟買好的雜貨。
//創造隨機時間的函式
function getRandomTime(x){
return Math.floor(Math.random()*x)+1;
};
//參考:https://ithelp.ithome.com.tw/articles/10197904
//____________________________ //
//洗狗
function jsAskYouToDo1(){
setTimeout(function washDog(){return "狗洗好了";} ,1200000);
}
//買雜貨
function jsAskYouToDo2(){
setTimeout(function buyGroceries(){return "買雜貨中";} ,getRandomTime(2));
}
//接她
function jsAskYouToDo3(){
setTimeout(function pickHerUp(){return "該接她了";} ,getRandomTime(2));
}
然而根據上圖,現在你肯定的只有:狗會洗20分鐘,剩下都不能保證阿
如果你是聰明的工具人,是不是會先打電話問清楚她到底幾點到,甚至直接叫外送雜貨呢?
如果不是使用回呼函式,就算你希望能照順序執行,結果卻未必如此。
console.log(jsAskYouToDo1());
console.log(jsAskYouToDo2());
console.log(jsAskYouToDo3());
// 可能的結果:
//1.洗好狗了 > 她到了 > 買雜貨完了
//2.買完雜貨 > 狗才洗好 > 她到了
// 甚至是最慘的:
//她到了 > 狗洗好了 > 現在才買完雜貨
這時候就能確保每件事情有按照你要的順序被執行
jsAskYouToDo1(jsAskYouToDo2(jsAskYouToDo3()));
上面這張的圖,就能預期它執行的順序是:
washDog > buyGroceries > pickHerUp
身為頭等工具人,當然先安排規劃行程,她的每一分每一秒都不可浪費的
但是啊,隨著她發現你越好用(?)之後,要求可能也會越多,正所謂:工具力越大,責任越大
假設她把半天的雜事行程都交給你代勞,你也很認真的規劃,就會像下面這樣:
function buyBreakfast(){
console.log("早餐買好了");
return function doTheLaundry(){
console.log("衣服洗好了");
return function walkTheDog(){
console.log("遛好狗了");
return function buyLunch(){
console.log("午餐買好了")
};
};
};
};
真是個好用的工具呢
但重點是這個方法有不少缺點,容我以下簡單條列:
鄭列:這時候就是我的另外的型態 - 生成器 登場的時刻了。
我:(第一次聽到比較屌的名稱)..好。
-- to be continued --
那今天就到這邊摟!今天分享喜歡的歌是:
老王樂隊|枯萎的玫瑰 Withered Roses (Official)
https://www.youtube.com/watch?v=s0lFWZIYzi8
每天的休息,是為了後面的追求,明天見。
- 忍者2
- MDN
- [討論] 請問這是工具人之神嗎?
- W3school -setTimeOut()