async/awaitやPromiseを理解する前段階として
「コールバック関数」と呼ばれる仕組みについて個人的に理解を試みた備忘録です
いつ使う?
時間がかかる処理を実行するとき、その処理結果を待って次の処理に渡したい
そんなときに使える
どう使う?
関数を引数で渡す
...とにかくやってみる
まずは普通にgetValue1, getValue2の順番で実行するコードを書いてみる
コード1.gs
run1(); function run1() { getValue1(); getValue2(); } function getValue1() { console.log('hello'); } function getValue2() { console.log('world'); } |
意訳run1を実行する この機能がやること getValue1()を実行する getValue2()を実行する この機能がやること helloをログに出す この機能がやること worldをログに出す |
run1() を実行すると
hello
world
という順番でログが出力される
getValue1の処理に時間がかかる場合のコードを書いてみる
getValue1の処理が終わるのを待たずにgetValue2()が実行される
コード2.gsrun2(); function run2() { setTimeout(getValue1, 1000); getValue2(); } function getValue1() { console.log('hello'); } function getValue2() { console.log('world'); } |
意訳run2を実行する この機能がやること getValue1()を1000ミリ秒後に実行する getValue2()を実行する この機能がやること helloをログに出す この機能がやること worldをログに出す |
run2() を実行すると
world
hello
という順番でログが出力される
getValue1の処理が終わってからgetValue2の処理を実行したい
ここでコールバック関数を使ってみる
コード3.gsrun3(); function run3() { setTimeout(function() {getValue1(getValue2)}, 1000); } function getValue1(arg) { console.log('hello'); arg(); } function getValue2() { console.log('world'); } | 意訳run3を実行する この機能がやること getValue1にgetValue2関数を引数で渡して1000ミリ秒後に実行する この機能がやること helloをログに出す argに入っているgetValue2関数を実行する この機能がやること worldをログに出す |
run3() を実行すると
hello
world
という順番でログが出力される
コード3.gsのsetTimeoutの第一引数が長いので
myFunctionという名前の関数を作って書き換えてみる
コード4.gsrun4(); function run4() { setTimeout(myFunction, 1000); } function myFunction() { getValue1(getValue2); } function getValue1(arg) { console.log('hello'); arg(); } function getValue2() { console.log('world'); } | 意訳run4を実行する この機能がやること myFunctionを1000ミリ秒後に実行する この機能がやること getValue1にgetValue2関数を渡して実行する この機能がやること helloをログに出す argに入っているgetValue2関数を実行する この機能がやること worldをログに出す |
run4() を実行すると
hello
world
という順番でログが出力される
このあとasync/awaitとPromiseの理解も試みるともうちょっと理解できるかも
参考
Callback function (コールバック関数)