Callback とは?後で呼ばれるために渡す関数
callback は、他のコードが後で呼び戻せるようにそのコードへ渡す関数で、一般にはイベントが起きたときや非同期タスクが完了したときに呼ばれます。
callback は「あれが終わったらこれをする」を扱う最も古い方法の 1 つです。関数を API に渡すと、API はそれを保持し、データが届いたときや timer が発火したときなど適切な瞬間に呼び出します。callback はシンプルでどこにでもありますが、多くをネストすると、しばしば「callback hell」と呼ばれる絡まったスタイルになります。
callback を成り立たせるもの
callback は値として使われる関数にすぎません。後で呼び出されるために引数として渡されます。受け取る側のコードが、いつどんな引数で呼ぶかを決めます。これは制御を逆転させます。あなたが振る舞いを提供し、フレームワークがタイミングを決めます。
callback が現れる場所
- クリックや受信メッセージのような event handler。
- ファイル読み取りの完了のような、非同期 I/O の完了。
- map、filter、reduce のような higher-order function。
- setTimeout や setInterval のような timer とスケジューリング。
callback hell
ある非同期のステップが別のステップの結果に依存すると、callback が callback の中にネストし、ステップごとに深くなります。コードは右へ流れ、読むのもエラーを扱うのも難しくなります。promise と async/await は、これを平坦化するために大きく作られました。
callback でのエラー処理
一般的な慣習はエラーを callback の最初の引数として渡します(「error-first」パターン)。機能しますが誤りやすく、エラーの確認を忘れると失敗が黙って通り過ぎます。これが promise が主流になった理由の 1 つです。
簡単な例
arr.forEach(item => console.log(item)) では、アロー関数が callback です。forEach が要素ごとに一度それを呼び、あなたが直接呼ぶことは決してありません。
CI における callback
callback の発火に依存するテストは、callback が決して動かなかったり assert の後に動いたりすると、ハングしたり flaky になったりしえます。こうしたタイミングのバグは混雑した runner で間欠的に fail します。Latchkey は callback 駆動のテストを安定させる間、一時的な失敗を自動 retry するため、1 回の flaky な実行が merge をブロックしません。
重要なポイント
- callback は、後で呼び出されるために他のコードへ渡される関数です。
- イベント処理や旧式の非同期の基礎ですが、ネストは callback hell を招きます。
- promise と async/await が深い callback の連鎖をおおむね置き換えました。