コールバック地獄
一瞬、「コールバック地獄」ではなくて「継続地獄」では、と思ったが、継続に限定して起こる問題ではないmrsekut.icon
「高階関数が引数に取る関数」が高階関数である、というのが連鎖することで地獄が生じる
同様に、「ある処理のあとに実行する関数」をcallback'と名付けるとすると
コールバック地獄になるのはcallback'の根本原因ではないし、
非同期処理をcallback'を用いて実装しようとしているから、というのも根本原因ではない
↑この辺がよく原因として挙げられているが、そこは本質ではない
「コールバック関数」という単語が指すものはもう少し広いし、コールバック地獄の原因はそこにある 問題点
深いネスト
見た目が悪い
コールスタックが積まれる
処理の追加、削除がしづらい
非同期処理をコールバック関数を用いて実装したことで生まれる地獄の例
data1.txtなどのテキストを順番に読み込んでいき、data5.txtまで読み込み終わったら、連結して表示する
code:ts
fs.readFile("data1.txt", (data1: string) => {
fs.readFile("data2.txt", (data2: string) => {
fs.readFile("data3.txt", (data3: string) => {
fs.readFile("data4.txt", (data4: string) => {
fs.readFile("data5.txt", (data5: string) => {
console.log(data1 + data2 + data3 + data4 + data5);
console.log("===↑result↑===");
});
});
});
});
});
順番に読み込み、結果を同時出力するために、複数のコールバック関数が必要になる
仮に以下のように書くと、===↑result↑===が表示されたあとに、data1が表示される
code:ts
fs.readFile("data1.txt", (data1: string) => {
console.log(data1);
});
console.log("===↑result↑===");
回避策
参考