English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS 基礎チュートリアル

NodeJS Express.js

NodeJS バッファー&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS ファイル(FS)

NodeJS その他

Node.js コールバック関数

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スクリプトです。このスクリプトは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ネストされたコールバック関数の例

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 コールバック関数では、コールバック関数の実行フローとそれらが非同期を実現する方法、およびネストされたコールバック関数を例とともに使用する方法について学びました。