Node.jsは,コールバック関数による非同期プログラミングができるのが特徴です.今回はそのコールバック関数について見ていきます.コールバック関数とは関数に渡す関数のことです.この関数を駆使することで非同期処理を実現しています.では詳しく見ていきましょう.
実際にどのように使われているか見てからの方が分かりやすいと思うので,Node.jsでテキストファイルを読み込むコードを参考にコールバック関数を解説していきます.まずはこちらのコードを見てください.
const fs = require('fs');
fs.readFile('sample.txt', 'utf8', function( err , data ){
console.log('このテキストはあとで実行されます');
if(err){
console.log(err);
return;
}
//data='これはテキストファイルからの文字列です.'
console.log(data);
});
console.log('このテキストは先に実行されます.');
これはテキストファイルからの文字列です.
このコードはsample.txtから文字列を取り出して,コンソールに表示するだけのコードです.コンソールに出力する順番も確認したいので,所々にコンソール出力しています.出力結果を見てみましょう.
実行結果を見てわかるように,上から順番に出力されておらず,ファイル読み込み中の関数内の出力は後から実行されています.
これがNode.jsのコールバック関数の仕組みになります.関数の引数にコールバック関数を設定することで,処理が終わったら呼び出す関数を設定できます.今回の例では,ファイルを読み込む処理は,全ての処理が終わった後にコールバック関数が実行されることで,コンソールへの出力が前後しています.
Node.jsに限らず,jQueryにもかなりの確率で出てくるので必ず書き方を覚えておきましょう.ここでコールバック関数を書くときのルールをいくつか解説します.
コールバック関数のエラーは第一引数で受け取る
コールバック関数を使うときは,必ず第一引数でエラーをとるようにします.これは「error-first callback(第一引数をエラー)」というルールがあります.
Node.js v12.18.2 Documentation
https://nodejs.org/docs/latest-v12.x/api/errors.html
APIドキュメントによると「エラー発生時にはerrにエラーオブジェクトが返され,エラーが発生しなければnullを返す」と記載されています.コールバック関数を設定しているときは,err処理をするようにしておきましょう.上記のコードの例ではif文によるエラー処理を行っています.
if(err){
console.log(err);
return;
}
最後の引数をコールバックとする
エラーのオブジェクトを渡す引数を第一引数とするルールと同様に,コールバックは最後の引数とするルールがあります.特別な状況を除いて,原則的には最後に設定しましょう.この2つのルールを守ることで読みやすいコードも作れます.
今回は簡単にコールバック関数の説明をしましたが,そこまで難しいものではありません.とりあえず,コールバック関数とは後回しにされる関数と思っておきましょう.後回しにされることで非同期処理を実現できています.またif文によるエラー処理や,コールバック関数のルールも頭に入れておくとコードも見やすくなるでしょう!詳しい説明は下記のページが最も分かりやすいと思います.
JavaScriptの「コールバック関数」とは一体なんなのか
https://sbfl.net/blog/2019/02/08/javascript-callback-func/