Node.js コールバック関数

Node.js REPL Node.jsイベントループ

Node.js 非同期プログラミングの直接的な具体例はコールバックです。

非同期プログラミングはコールバックに依存しますが、コールバックを使用した後はプログラムが非同期であるとは言えません。

コールバック関数はタスクの完了後に呼び出されます。ノードは多くのコールバック関数を使用します。ノードのすべての API はコールバック関数をサポートしています。

たとえば、ファイルの読み取り中に他のコマンドを実行し、ファイルの読み取り後にファイルの内容をコールバック関数のパラメータとして返すことができます。 この方法では、ファイル I/O 操作をブロックしたり待機したりすることなく、コードが実行されます。 これにより、Node.js のパフォーマンスが大幅に向上し、多数の同時リクエストを処理できるようになります。

コールバック関数は通常、関数の最後のパラメータとして表示されます。

function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

ブロックコードの例

次の内容を含むファイル input.txt を作成します。

HTMLチュートリアルのアドレス:w3cstudy.cc

main.js ファイルを作成します。コードは次のとおりです。

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("プログラム実行の終了!");

上記のコードの実行結果は次のようになります

$ node main.js
HTMLチュートリアルのアドレス:w3cstudy.cc

プログラムの実行が終了しました!

ノンブロッキング コードの例

次の内容を含むファイル input.txt を作成します。

HTMLチュートリアルのアドレス:w3cstudy.cc

main.js ファイルを作成します。コードは次のとおりです。

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("プログラム実行の終了!");

上記コードの実行結果は以下の通りです:

$ node main.js
プログラム実行の終了!
HTMLチュートリアルのアドレス:w3cstudy.cc

上の 2 つの例では、ブロック呼び出しと非ブロック呼び出しの違いが理解できました。 最初のインスタンスは、ファイルが読み取られた後にプログラムを実行します。 2 番目の例では、ファイルが読み取られるまで待つ必要がないため、ファイルを読み取っている間に次のコードを実行できるため、プログラムのパフォーマンスが大幅に向上します。

したがって、ブロッキングはシーケンシャルに実行されますが、ノンブロッキングはシーケンシャルである必要がないため、コールバック関数のパラメータを処理する必要がある場合は、コールバック関数内に記述する必要があります。