generated at
コールバック地獄
コールバック関数高階関数、というのが連鎖するとコールバック地獄になる


一瞬、「コールバック地獄」ではなくて「継続地獄」では、と思ったが、継続に限定して起こる問題ではないmrsekut
「高階関数が引数に取る関数」が高階関数である、というのが連鎖することで地獄が生じる
同様に、「ある処理のあとに実行する関数」を callback' と名付けるとすると
コールバック地獄になるのは callback' の根本原因ではないし、
非同期処理を callback' を用いて実装しようとしているから、というのも根本原因ではない
↑この辺がよく原因として挙げられているが、そこは本質ではない
コールバック関数」という単語が指すものはもう少し広いし、コールバック地獄の原因はそこにある


問題点
深いネスト
見た目が悪い
コールスタックが積まれる
処理の追加、削除がしづらい


非同期処理をコールバック関数を用いて実装したことで生まれる地獄の例
data1.txtなどのテキストを順番に読み込んでいき、data5.txtまで読み込み終わったら、連結して表示する
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 が表示される
ts
fs.readFile("data1.txt", (data1: string) => { console.log(data1); }); console.log("===↑result↑===");




回避策

参考