Nodejsの非同期callback_node.jsのエレガントな処理方法

WBOY
リリース: 2016-05-16 16:35:28
オリジナル
1098 人が閲覧しました

はしがき

Nodejs の最大のハイライトは、イベント駆動型のノンブロッキング I/O モデルです。これにより、Nodejs は強力な同時処理機能を備え、ネットワーク アプリケーションの作成に非常に適しています。 Nodejs のほとんどの I/O 操作はほぼ非同期です。つまり、I/O 操作の結果は基本的に、ファイルの内容を読み取る次の関数などのコールバック関数で処理する必要があります。

コードをコピーします コードは次のとおりです:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
console.log(データ);
});

では、2 つのファイルを読み取り、その 2 つのファイルの内容を結合して処理する場合はどうすればよいでしょうか?

コードをコピーします コードは次のとおりです:
fs.readFile('/etc/passwd', function (err, data) {
if (err) throw err;
fs.readFile('/etc/passwd2', function (err, data2) {
If (err) throw err;
// ここでdataとdata2のデータを加工します
});
});


複数の同様のシナリオを扱う場合、コールバック関数が層ごとにネストされることになるのではないでしょうか。これは、よくコールバック ピラミッドまたはコールバック地獄と呼ばれるものです (http://callbackhell.com/)

) は、js 初心者にとって最も厄介な問題でもあります。 この種のネストされたコードは、開発に多くの問題をもたらします。主に以下の点に反映されます。

1. コードの可能性が悪化します

2. デバッグの難しさ

3. 異常発生時の対処が難しい

この記事では主に、上記の非同期コールバックの問題を適切に処理する方法を紹介します。

基本的な解決策: 非同期コールバックを再帰的に処理します

コードの実行制御ツールとして再帰を使用できます。実行する必要がある操作を関数にカプセル化し、コールバック関数での再帰呼び出しを通じてコードの実行プロセスを制御します。これ以上はせずに、最後のコードに進みましょう:

コードをコピーします コードは次のとおりです:
var fs = require('fs');
// 処理するファイルのリスト
var files = ['file1', 'file2', 'file3'];

関数 parseFile () { if (files.length == 0) {

戻る;
}
var file = files.shift();
fs.readFile(ファイル, 関数 (エラー, データ) {
// ファイルデータはここで処理されます
ParseFile(); // 処理後、再帰呼び出しで次のファイルを処理します
});
}

//処理を開始します

parseFile();



上記のコードは、例として配列内のファイルを順番に処理し、コードの実行フローを制御するための再帰的メソッドを導入しています。

これをいくつかの単純なシナリオに適用すると、たとえば、このメソッドを使用して配列内のデータをデータベースに順番に保存できます。

いくつかの単純な非同期コールバックの問題は、再帰によって解決できます。ただし、複雑な非同期コールバック (複数の非同期操作の結果を同期する必要があるなど) を処理することはまだ多少できません。

素晴らしい点: Async、Q、Promise などのサードパーティ ライブラリを使用して非同期コールバックを処理します

ネストされたコールバックの問題をより適切に処理するために、非同期処理に特化したサードパーティ ライブラリの使用を検討できます。もちろん、能力があれば、非同期処理用の独自の補助ツールを作成することもできます。

非同期処理を処理するためにより一般的に使用されるライブラリは、async、q、promise です。 npmjs.org Web サイトから判断すると、async が最も人気があります。私も以前 async を使用したことがありますが、さまざまな非同期処理の制御フローも非常によく実装されています。

非同期を使用して、2 つのファイルを同時に読み取る最初のコードを処理します。例は次のとおりです。

コードをコピー コードは次のとおりです:

var async = require('async')
、fs = require('fs');

async.Parallel([
関数(コールバック){
fs.readFile('/etc/passwd', function (err, data) {
If (err) callback(err);
callback(null, data);
});
}、
関数(コールバック){
fs.readFile('/etc/passwd2', function (err, data2) {
If (err) callback(err);
callback(null, data2);
});
}
]、
関数(エラー、結果){
// ここではdataとdata2のデータを処理し、結果から各ファイルの内容を取得します
});

async モジュールを通じて、非同期実行プロセスを適切に制御できます。これは、すべてのレベルでのコールバックの問題を解決するとみなすこともできます。コードは以前よりも明確になりましたが、それでもコールバック関数と切り離すことはできません。

考えてみてください。コールバック関数を使用せずに非同期処理を処理できたら素晴らしいと思いませんか? 次に、この目標を達成するために ES6 の新機能を使用する方法について説明します。

エレガントに: ES6 を採用し、コールバック関数を置き換え、コールバック地獄の問題を解決します

EcmaScript Harmony (ES6) は js に多くの新機能を導入したと言われています。ES6 についてあまり知らない学生は、Baidu で確認してください。

nodejs で ES6 の新機能を使用するには、バージョン v0.11.x 以降を使用する必要があります。

この記事では、コールバック関数を置き換えるジェネレーター機能の使用方法を紹介します。ジェネレーターについてご存知ですか?こちらからご覧いただけます。

ここでは、co と thunkify の 2 つのモジュールが使用されています。これらは、npm install コマンドを使用してインストールできます。

この記事の冒頭で述べた問題を例として考えてみましょう。ジェネレーター機能を使用するコード例は次のとおりです。

コードをコピーします コードは次のとおりです:

var fs = require('fs')
、co = require('co')
、thunkify = require('thunkify');

var readFile = thunkify(fs.readFile);

co(function *() {
var test1 = yield readFile('test1.txt');
var test2 = yield readFile('test2.txt');
var test = test1.toString() test2.toString();
console.log(テスト);
})();

コード内での例外の処理も非常に簡単です。これを実行するだけです。

コードをコピーします コードは次のとおりです:

{
を試してください var test1 = yield readFile('test1.txt');
} キャッチ (e) {
// ここで例外を処理します
}

このコードはもっとエレガントではないでしょうか?同期コードを書くのと同じように非同期コードを扱えるのは素晴らしいことではないでしょうか?

nodejs の分野での Web 開発では、最も人気のあるフレームワークは Express です。Express の中心メンバーである TJ が、次世代 Web であると主張される新しい Web フレームワーク koa を主導したことは注目に値します。開発フレームワークでは、koa は ES6 のジェネレーター機能を活用しており、Web システム開発時にコールバックの層に陥ることを回避できます。

概要

fibjs プロジェクトのプロモーションからの文を引用: Less Callback, More Girls - Less Callback, more girls

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート