Node.js コールバック関数


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

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

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

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


ブロックコード例

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

php中文网官网地址:www.php.cn

次のコードでmain.jsファイルを作成します:

var fs = require("fs");

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

console.log(data.toString());
console.log("程序执行结束!");

上記のコードの実行結果は次のとおりです:

$ node main.js
php中文网官网地址:www.php.cn

程序执行结束!

Non -ブロッキングコード例

ファイルinput.txtの作成、内容は以下の通り:

php中文网官网地址:www.php.cn

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
程序执行结束!
php中文网官网地址:www.php.cn

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

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