序文
NodeJSの最大のハイライトは、イベント駆動型の非ブロッキングI/Oモデルです。これにより、NodeJは強力な並行性処理機能を備えており、ネットワークアプリケーションの作成に非常に適しています。 nodejsのほとんどのI/O操作はほとんど非同期です。つまり、I/O操作の結果は、ファイルのコンテンツを読み取る次の関数など、コールバック関数で基本的に処理する必要があります。
コードコピーは次のとおりです。
fs.readfile( '/etc/passwd'、function(err、data){
(err)スローERR;
console.log(data);
});
それでは、2つのファイルを読み、これら2つのファイルの内容をマージした場合はどうすればよいですか? JSと接触していないほとんどの人はこれを行うかもしれません:
コードコピーは次のとおりです。
fs.readfile( '/etc/passwd'、function(err、data){
(err)スローERR;
fs.readfile( '/etc/passwd2'、function(err、data2){
(err)スローERR;
//データとデータ2のデータを処理します
});
});
複数の同様のシナリオを扱う場合、コールバック関数がレイヤーごとにネストされたレイヤーであるということではないでしょうか?これは、人々がしばしばPyramidまたはCallback Hell(http://callbackhell.com/)を呼び戻すものであり、JS Noviceにとって最も厄介な問題でもあります。
この種のネストされたコードは、多くの問題を開発にもたらしました。主に以下に反映されています。
1.コードの可能性が悪化します
2。デバッグの困難
3.例外が発生した後に確認することは困難です
この記事では、主に上記の非同期コールバックの問題をエレガントに処理する方法を紹介します。
主な解決策:非同期コールバックを再帰的に処理します
コードの実行制御ツールとして再帰を使用できます。機能に実行する必要がある操作をカプセル化し、コールバック関数を再帰的に呼び出すことにより、コードの実行プロセスを制御します。これ以上苦労せずに、ナンセンスについて話しましょう。前のコードを見てみましょう。
コードコピーは次のとおりです。
var fs = require( 'fs');
//処理されるファイルのリスト
var files = ['file1'、 'file2'、 'file3'];
function parsefile(){
if(files.length == 0){
戻る;
}
var file = files.shift();
fs.readfile(file、function(err、data){
//ここでファイルデータを処理します
parsefile(); //処理後、再帰通話を介して次のファイルを処理します
});
}
//処理を開始します
parsefile();
上記のコードは、リクール平均を通じてコードを制御する実行プロセスを導入する例として、配列内のファイルを順番に処理しました。
次のようないくつかの簡単なシナリオに適用することは良いことです。次のようなものです。この方法を使用して、配列内のデータをデータベースに保存することで使用できます。
再帰的に、いくつかの単純な非同期コールバックの問題を解決できます。ただし、複雑な非同期コールバック(複数の非同期操作の結果を同期するなど)に対処することは依然として無力に思えます。
ゴージャスなポイント:Async、Qなどのサードパーティライブラリを使用して、非同期コールバックを処理することを約束します
ネストされたコールバックをより適切に処理するために、非同期を特に扱うサードパーティライブラリを使用することを検討できます。もちろん、機能がある場合は、非同期処理のための補助ツールを自分で作成できます。
非同期処理を処理するために最も一般的に使用されるライブラリは、Async、QおよびPromiseです。 NPMJS.orgのWebサイトから判断すると、Asyncが最も人気があります。私は以前にAsyncを使用したことがありますが、それは確かに非常に便利であり、さまざまな非同期処理制御フローが適切に実装されています。
以下に示すように、ASYNCを使用して、最初に2つのファイルを同時に読み取るコードを処理します。
コードコピーは次のとおりです。
var async = require( 'async')
、fs = require( 'fs');
async.parallel([
関数(コールバック){
fs.readfile( '/etc/passwd'、function(err、data){
if(err)callback(err);
コールバック(null、data);
});
}、
関数(コールバック){
fs.readfile( '/etc/passwd2'、function(err、data2){
if(err)callback(err);
コールバック(null、data2);
});
}
]、、
関数(err、results){
//ここでデータとデータのデータを処理し、各ファイルのコンテンツは結果から取得されます
});
ASYNCモジュールを通じて、非同期実行プロセスを適切に制御でき、レイヤードコールバックの問題も解決できます。コードは以前よりも明確ですが、それでもコールバック関数から分離することはできません。
考えてみてください。コールバック関数を使用せずに非同期を処理できれば素晴らしいでしょう。次に、ES6の新機能を使用してこの目標を達成することについて話しましょう。
エレガントなポイント:ES6を受け入れ、コールバック関数を交換し、コールバックHELL問題を解決します
ちなみに、ECMAScript Harmony(ES6)はJSに多くの新機能を導入しました。 ES6についてあまり知らない学生は、自分でBaiduの外観を取ることができます。
nodejsでES6の新機能を使用するには、v0.11.x以上を使用する必要があります。
この記事では、コールバック関数の代わりにジェネレーター機能の使用を紹介します。発電機については知りませんか?ここでチェックできます。
ここでは、2つのモジュールCOとThunkifyを使用し、NPMインストールコマンドを使用してインストールします。
例として、この記事の冒頭で言及された問題を考えてみましょう。ジェネレーター機能を使用した例のコードは次のとおりです。
コードコピーは次のとおりです。
var fs = require( 'fs')
、co = require( 'co')
、thunkify = require( 'thunkify');
var readfile = thunkify(fs.readfile);
co(function *(){
var test1 = evelow readfile( 'test1.txt');
var test2 = evelow readfile( 'test2.txt');
var test = test1.toString() + test2.toString();
console.log(test);
})();
また、コードの例外を処理することも非常に簡単です。この方法で行うだけです。
コードコピーは次のとおりです。
試す {
var test1 = evelow readfile( 'test1.txt');
} catch(e){
//ここで例外を処理します
}
この種のコードはもっとエレガントですか?同期コードを書くように非同期に処理するのは素晴らしいことではありませんか?
NodeJSフィールドでのWeb開発のための最も人気のあるフレームワークはExpressです。 Expressの偉大なマスターであるExpress TJのコアメンバーが、次世代のWeb開発フレームワークであると主張する新しいWebフレームワークを主導したことに言及する価値があります。 KOAは、ES6ジェネレーターの機能を実際に使用して、Webシステムを開発するときにコールバックの層に陥ることを避けるのに役立ちます。
要約します
FIBJSプロジェクトプロモーションからの文を引用:コールバックが少なく、女の子が増え、コールバックが少なく、女の子が増えます