English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Node.jsのコールバック関数:非同期性はNode.jsが人気を博す基本要素の1つです。コールバックは非同期関数の実現です。一般的に、Node.jsでは、多くのリソース処理関数にコールバックバリエーションがあります。
あるタスクに対して非同期関数のリソースを呼び出した場合、そのコントロールは直ちにその関数の後の次のステートメントの実行に移行します。リソース上のタスクは並行して開始されます。これは、以下のように役立ちます。 Node.jsは他のタスクを続行しながら、この関数がリソースを使用している間に実行し、リソースを使用するタスクが完了すると、Node.jsはコールバック関数を使用して復帰します。 コールバック関数はデータオブジェクト、結果オブジェクト、および(または)タスクに関連する情報を含むエラーオブジェクトを引数に持っています。
ブロッキング関数:非同期関数とは対照的に、同期関数はリソースが完了するまで実行ブロックを続けます。したがって、同期関数もブロッキング関数と呼ばれます。
Node.jsのネストされたコールバック関数 :リソースに対して連続して複数の操作を行い、それが非同期でなければならない場合、コールバック関数を相互にネストすることができます。
今、ファイル(タスク)読み込み(リソース)を行う際に、コールバック関数とブロッキング関数を比較して、3つの状況を見てみましょう。
Node.jsのブロッキング関数の例
Node.jsのコールバック関数の例
Node.jsネストされたコールバック関数の例
以下はサンプルのNode.jsスクリプトです。このスクリプトはsample.txtファイルを同期で読み込みます。
var fs = require('fs'); // ファイルsample.txtを読み込みます var data = fs.readFileSync('sample.txt'); console.log("ファイル読み取り完了: " + new Date().toISOString()); console.log("After readFileSync statement : " + new Date().toISOString());
上記のプログラムを実行した場合
ターミナル出力
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-sync.js ファイル読み取り完了: 2017-10-19T12:21:40.103Z After readFileSync statement : 2017-10-19T12:21:40.105Z
after readFileSync 语句总是在完成读取文件后才执行。 fs.readFileSync 阻塞了执行流。
以下はサンプルのNode.jsスクリプトです。このスクリプトはNode.jsのコールバック関数sample.txtファイルの非同期読み込みです。
var fs = require('fs'); // ファイルsample.txtを読み込みます fs.readFile('sample.txt', // ファイルを読み込んだときに呼び出されるコールバック関数です function(err, data) { if (err) throw err; // データはファイル内容を含むバッファーです console.log("ファイル読み取り完了: " + new Date().toISOString()); }); console.log("readFile非同期実行後: " + new Date().toISOString());
上記のプログラムを実行した場合
ターミナル出力
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-async.js readFile非同期実行後: 2017-10-19T12:25:36.982Z ファイル読み取り完了: 2017-10-19T12:25:36.987Z
console.log を実行した後でも、ファイルの読み取りが完了するまでには約5ミリ秒。file. fs.readFile('sample.txt', callback function{..}) はブロッキングを実行せず、ファイルを読み取るために新しいプロセスを並行して起動します(リソースに対するタスクの実行)。
Node.jsのネストされたコールバック関数を示すために、ファイルをリネームしてその後非同期関数を使用して削除する方法を検討します。
var fs = require('fs'); fs.rename('sample.txt', 'sample_old.txt', // 一回目のコールバック機能 function (err) { if (err) throw err; console.log('File Renamed.'); fs.unlink('sample_old.txt', // 二回目のコールバック機能 function (err) { if (err) throw err; console.log('File Deleted.'); } ); } );
上記のNode.jsサンプルをnodeと一緒に実行した場合
ターミナル出力
arjun@arjun-VPCEH26EN:~/nodejs$ node nodejs-nested-callback.js File Renamed. File Deleted.
このNode.jsチュートリアル– Node.js コールバック関数では、コールバック関数の実行フローとそれらが非同期を実現する方法、およびネストされたコールバック関数を例とともに使用する方法について学びました。