iT邦幫忙

2021 iThome 鐵人賽

DAY 13
1
Modern Web

追求JS小姊姊30天系列 第 13

追求JS小姊姊系列 Day13 -- 方函式的能力展現:懂回呼函式才能當好工具人

  • 分享至 

  • xImage
  •  

前情提要

方函式似乎正要解釋所謂的回呼函式

方函式:鄭列的能力啊,是很不錯,但是啊... 有些事情重視的就不是什麼多會整理、尋找,而是優先順序
:這又是什麼工具人感慨嗎?
方函式:你看麻,工具歸工具,但他也有自己的事情要處理,總會有比較忙的時候,隨便舉個例子


工具人要懂的優先順序跟時間管理

在沒有時間的因素下

假設今天你要處理: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

(溫馨提醒:在現實生活中,就算事情做對了,但處理太久(例如買雜貨)讓她等,仍然會讓你的工具評分下降。)

再會安排時間,事情一多就也會遇到困難 (傳說中的callback hell)

身為頭等工具人,當然先安排規劃行程,她的每一分每一秒都不可浪費的
但是啊,隨著她發現你越好用(?)之後,要求可能也會越多,正所謂:工具力越大,責任越大

假設她把半天的雜事行程都交給你代勞,你也很認真的規劃,就會像下面這樣:

function buyBreakfast(){
    console.log("早餐買好了"); 
    return function doTheLaundry(){
        console.log("衣服洗好了");
        return function walkTheDog(){
            console.log("遛好狗了");
            return function buyLunch(){
                console.log("午餐買好了")
            };
        };
    };
};

真是個好用的工具呢
但重點是這個方法有不少缺點,容我以下簡單條列:

  1. 閱讀上困難
  2. 釐清功能的執行順序

鄭列這時候就是我的另外的型態 - 生成器 登場的時刻了。
:(第一次聽到比較屌的名稱)..好。

-- to be continued --


那今天就到這邊摟!今天分享喜歡的歌是:
老王樂隊|枯萎的玫瑰 Withered Roses (Official)
https://www.youtube.com/watch?v=s0lFWZIYzi8

每天的休息,是為了後面的追求,明天見。


reference:

  1. 忍者2
  2. MDN
  3. [討論] 請問這是工具人之神嗎?
  4. W3school -setTimeOut()

上一篇
追求JS小姊姊系列 Day12 -- 還是沒躲掉,方函式登場
下一篇
追求JS小姊姊系列 Day14 -- 方函式的能力展現:認識生成器,工具人更神氣(上)
系列文
追求JS小姊姊30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
wendy
iT邦新手 2 級 ‧ 2021-09-28 15:05:10

讚喔 完美工具人

也想要一個嗎?
/images/emoticon/emoticon30.gif

0
MJ
iT邦新手 4 級 ‧ 2021-09-28 15:09:01

讚喔 完美工具人

... 要大叔嗎? (被揍

0
Hooo
iT邦新手 4 級 ‧ 2021-09-28 15:52:06

原來工具人故事 reference 是 PTT 呀 XD

我會當作妳是真的在發問 XD

我要留言

立即登入留言