コールバックをちゃんと理解したい①

2020/12/03

非同期処理をちゃんと理解するぞ!
ということで,今日はコールバックやっていきます。

コールバックって?

コールバック関数とは,「引数として渡される関数」のこと。
非同期処理で,例外処理を行ったり,処理に順番を付けたりするのをコールバックを使用して実現することができます。

コールバックを実装してみる

単純なコールバック

// 実行される関数
const execFunc = (callback) => {
  console.log('execute!!');
  callback();
};

// 引数として渡される関数 = コールバック関数
const callbackFunc = () => {
  console.log('I am CollBack!!');
};

// 実行
execFunc(callbackFunc);

// 実行結果
// → execute!!
// → I am CollBack!!

まだギリ理解できます。
execFunc関数の引数にコールバック関数としてcallbackFunc関数を渡して,execFunc関数の処理の中でcallbackFuncが処理されます。

コールバック地獄への道

非同期処理が複数ある場合は,それぞれ処理にかかる時間が異なるため,順序が保証されません。

// 処理に5秒かかる非同期処理
const first = () => {
  setTimeout(() => {
    console.log('first');
  }, 5000);
};

// 処理に4秒かかる非同期処理
const second = () => {
  setTimeout(() => {
    console.log('second');
  }, 4000);
}

// 処理に3秒かかる非同期処理
const third = () => {
  setTimeout(() => {
    console.log('third');
  }, 3000);
}

// 非同期処理のため順番が保証されない
first();
second();
third();

// 実行結果
// → third
// → second
// → first

これをコールバックを使って,実行したい順に実行されるようにしてみます。

const first = (callback) => {
  setTimeout(() => {
    console.log('first');
    callback();
  }, 5000);
};

const second = (callback) => {
  setTimeout(() => {
    console.log('second');
    callback();
  }, 4000);
}

const third = () => {
  setTimeout(() => {
    console.log('third');
  }, 3000);
}

// 非同期処理を同期的に処理する
first(() => {
  second(() => {
    third();
  });
});

// 実行結果
// → first
// → second
// → third

処理が増えて行くと,その分ネストも深くなっていき可読性が非常に悪くなります。
これがいわゆるコールバック地獄というやつですね。

まとめ

非同期処理の基礎であるコールバック。
まだ,しっくりこない感はありますが,以前よりは理解が深まったと思います。
ふとした瞬間に腹落ちすることを願って。
引き続き非同期処理やっていきたいとおもいます。

それではまた明日。

参考


書いた人: こへ
音楽と漫画と読書とアニメとスノボが好き。多趣味でいろんなことに興味有ります。 誰しもが一度は使った事があるもののIoT開発をしてます。
Twitterフォローお願いします。