Node.js のコールバック関数

Isaac Tony 2023年10月12日
  1. Node.js でコールバック関数を使用してファイルを同期的に読み込む(ブロッキングコード
  2. Node.js でコールバック関数を使用して非同期にファイルを読み込む(ノンブロッキングコード
Node.js のコールバック関数

コールバック関数は、一連のタスクが実行された後に実行される関数であり、プログラム全体のブロックを回避します。コールバック関数は、Node.js で非同期および非ブロッキングプログラムを作成する上で重要な側面です。

JavaScript では、コールバック関数は正式には他の関数に引数として渡される関数と呼ばれます。JavaScript 関数は呼び出された順序で実行されるため、コールバックを使用すると、関数の実行方法をより適切に制御できます。

2つの密接に関連する関数があり、一方の関数の結果がもう一方の関数のパラメーターとして使用されるとします。このようなシナリオでは、初期関数の結果が準備できるまで、初期関数は常に 2 番目の関数をブロックします。

ただし、コールバック関数を使用すると、以下に示すように、ステートメントの実行が完了した後、最初の関数が常に最後の関数をコールバック関数として実行するようにすることができます。

function print(callback) {
  callback();
}

Node.js でコールバック関数を使用してファイルを同期的に読み込む(ブロッキングコード

Node.js コールバックは非同期操作の実行の基礎を形成し、Node.js を I/O 集約型アプリケーションの開発に適したものにします。このようなアプリケーションでは、サーバーから大量のデータをフェッチする必要があります。

大きなデータのロードは長いプロセスであるため、プログラムがデータを完全にロードするのを待ってから残りを実行することはお勧めできません。

以下の例では、Node.js の fs モジュールを使用して、残りのコードを実行する前にデータを同期的に読み取ります。

// Write JavaScript code
var fs = require('fs');

var filedata = fs.readFileSync('usersinfo.txt');
console.log(filedata.toString());
console.log('Other parts of the program that execute afterwards');
console.log('End of program execution');

サンプル出力:

First name: john
Last name: Doe
Occupation: Microservices Developer

Other parts of the program that execute afterward
End of program execution

Node.js でコールバック関数を使用して非同期にファイルを読み込む(ノンブロッキングコード

ファイルを同期的に読み取ると、データが完全に読み取られるまで、他のプログラムの部分の実行がブロックされます。データが膨大な場合は、もう少し待つ必要があるかもしれません。

ただし、以下に示すように、プログラムの他の部分を実行しながら、コールバック関数を使用してバックグラウンドでそのデータを非同期的に読み取る関数を実行できます。

var fs = require('fs');

fs.readFile('usersinfo.txt', function(err, data) {
  if (err) return console.error(err);
  console.log(data.toString());
});
console.log('Other parts of the program that execute afterward');

サンプル出力:

Other parts of the program that execute afterward
firstname: john
lastname: Doe
Occupation: Microservices Developer

上記のプログラムでコールバック関数の概念を使用すると、データがバックグラウンドでロードされるときに、プログラムの他の部分を実行できます。

さらに、上記のコードでは、コールバック関数の最初の引数としてエラーを返すという標準的な規則にも準拠しています。null 以外の場合、最初のオブジェクトはエラーオブジェクトと見なされます。それ以外の場合は、null のままにする必要があります。

エラーが発生したことを知る簡単な方法を提供します。従来、コールバック関数は、メイン関数が他の操作を実行した後に実行されることを意図しているため、2 番目のパラメーターとしてそれを使用するのが一般的な方法です。

コールバック関数を使用する事実上すべての非同期関数は、Node.js で以下の構文に従うことが期待されます。

function asyncOperation(param1, param2, callback) {
  // operations to be executed
  if (err) {
    console.log('An error has occured!');
    return callback(new Error('An error'));
  }
  // ... more work ...
  callback(null, param1, param2);
}

asyncOperation(parameters, function(err, returnValues) {
  // This code gets run after the async operation
});
著者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn