Node.js Promise チュートリアル
以前のチュートリアルでは、非同期イベントに使用されるコールバック関数について説明しました。しかし、コールバック関数がネストされ、プログラムが長く複雑になり始めると、悪夢になることがあります。
約束とは何ですか?
Promise の説明を始める前に、まず Node.js の「コールバック」関数とは何かを再確認しましょう。 これらのコールバック関数については前の章で何度も見てきましたので、そのうちの XNUMX つを簡単に見てみましょう。
以下の例は、に接続するために使用されるコード スニペットを示しています。 MongoDB データベースにアクセスし、データベース内のレコードの 1 つに対して更新操作を実行します。
- 上記のコードでは、 function(err,db) の部分は、匿名関数またはコールバック関数の宣言として知られています。 MongoClient が MongoDB データベースでは、接続操作が完了するとコールバック関数に戻ります。つまり、接続操作はバックグラウンドで行われ、完了するとコールバック関数が呼び出されます。これは、多くの操作を同時に実行できるようにし、ユーザーが操作を実行できないようにするための Node.js の重要なポイントの 1 つであることに注意してください。
- 2 番目のコード ブロックは、コールバック関数が実際に呼び出されたときに実行されるものです。コールバック関数は単に 1 つのレコードを更新するだけです。 MongoDB データベース。
では、約束とは何でしょうか? まあ、Promise は Node.js のコールバック関数を拡張したものにすぎません。 開発ライフサイクル中に、複数のコールバック関数を一緒にネストする必要がある場合があります。 これは、ある時点で非常に面倒になり、維持するのが困難になる可能性があります。 つまり、Promise は、これらの問題の軽減を目的としたコールバックの機能強化です。
Promise の基本的な構文を以下に示します。
var promise = doSomethingAync() promise.then(onFulfilled, onRejected)
- 「doSomethingAync」は、何らかの処理を行うコールバックまたは非同期関数です。
- 今回、コールバックを定義する際に「promise」と呼ばれる返される値があります。
- プロミスが返されるとき、2 つの出力を持つことができます。これは、「then 句」によって定義されます。操作は、「onFulfilled」パラメータによって示される成功になるか、「onRejected」パラメータによって示されるエラーになるかのいずれかです。
Note: したがって、Promise の重要な側面は戻り値です。 Node.js で通常のコールバックを操作する場合、戻り値の概念はありません。 戻り値のおかげで、コールバック関数の定義方法をより詳細に制御できます。
次のトピックでは、Promise の例と、Promise がコールバックからどのようにメリットを受けるかを見ていきます。
Promise へのコールバック
次に、Node.js アプリケーション内から「promise」を使用する方法の例を見てみましょう。 Node.js アプリケーションで Promise を使用するには、まず「Promise」モジュールをダウンロードしてインストールする必要があります。
次に、以下に示すようにコードを変更します。これにより、Promise を使用して 'Employee' コレクション内の Employeename が更新されます。
ステップ1) NPM モジュールのインストール
Node JS アプリケーション内から Promise を使用するには、Promise モジュールが必要です。 Promise モジュールをインストールするには、以下のコマンドを実行します。
npm インストールの約束
ステップ2) コードを変更して Promise を含める
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(err, db) { db.collection('Employee').updateOne({ "EmployeeName": "Martin" }, { $set: { "EmployeeName": "Mohan" } }); });
コードの説明:-
- 最初の部分は、コード内で Promise 機能を使用できるようにする「Promise」モジュールを含めることです。
- これで、「then」関数を MongoClient.connect 関数に追加できるようになりました。 つまり、データベースへの接続が確立されたときに、その後に定義されたコード スニペットを実行する必要があるということです。
- 最後に、「Martin」という名前の従業員の EmployeeName を「Mohan」に更新する作業を行うコード スニペットを定義します。
注: -
今、内容を確認してみると、 MongoDB データベースに「Martin」という従業員名を持つレコードが存在する場合、それは「Mohan」に更新されることがわかります。
データがデータベースに正しく挿入されたことを確認するには、次のコマンドを実行する必要があります。 MongoDB
- EmployeeDB を使用する
- db.Employee.find({従業員名:モハン})
最初のステートメントは、EmployeeDb データベースに接続していることを確認します。 XNUMX 番目のステートメントは、従業員名が「Mohan」であるレコードを検索します。
ネストされた Promise の処理
Promise を定義するときは、「then」メソッド自体が Promise を返すことに注意する必要があります。 つまり、ある意味、Promise は互いに入れ子になったり、連鎖したりすることができます。
以下の例では、チェーンを使用して 2 つのコールバック関数を定義しており、どちらもレコードを MongoDB データベース。
(注意: チェーンとは、メソッドの実行を相互にリンクするために使用される概念です。 アプリケーションに「methodA」と「methodB」という 2 つのメソッドがあるとします。 そして、そのロジックでは、「methodA」の後に「methodB」を呼び出す必要があり、その後、「methodB」が「methodA」の直後に呼び出されるように実行を連鎖させます。)
この例で注目すべき重要な点は、ネストされた Promise を使用することで、コードがよりクリーンで読みやすく、保守しやすくなることです。
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(db) { db.collection('Employee').insertOne({ Employeeid: 4, EmployeeName: "NewEmployee" }) .then(function(db1) { db1.collection('Employee').insertOne({ Employeeid: 5, EmployeeName: "NewEmployee1" }) }) });
コードの説明:-
- 現在、順番に実行される 2 つの「then」句を定義しています。 最初の then 句では、データベース接続を含む 'db' パラメータを渡します。 次に、「db」接続のコレクション プロパティを使用して、「Employee」コレクションにレコードを挿入します。 'insertOne' メソッドは、実際のドキュメントを Employee コレクションに挿入するために使用されます。
- 次に、2を使用しますnd then 句を使用して、データベースに別のレコードを挿入することもできます。
今、内容を確認してみると、 MongoDB データベースに挿入された 2 つのレコードが見つかります。 MongoDB データベース。
カスタム Promise の作成
カスタム Promise は、「q」というノード モジュールを使用して作成できます。 「q」ライブラリは、ノード パッケージ マネージャーを使用してダウンロードしてインストールする必要があります。 「q」ライブラリを使用した後、メソッド「denodeify」を呼び出すことができます。これにより、任意の関数が Promise を返す関数になります。
以下の例では、2 つの数値を加算する「Add」という単純な関数を作成します。この関数を、Promise を返す関数に変換します。
それが完了したら、Add 関数によって返された Promise を使用して、console.log にメッセージを表示します。
以下の手順に従って、Promise を返すカスタム関数を作成してみましょう。
ステップ1) NPM モジュールのインストール
Node JS アプリケーション内から 'q' を使用するには、'q' モジュールが必要です。 「q」モジュールをインストールするには、以下のコマンドを実行します。
npm インストール q
ステップ2) カスタム Promise を作成するために使用される次のコードを定義します。
コードの説明:-
- 最初のビットは、require キーワードを使用して「q」ライブラリをインクルードすることです。 このライブラリを使用すると、コールバックを返す関数を定義できるようになります。
- 変数 a と b で定義された 2 つの数値を加算する Add という関数を作成します。これらの値の合計は変数 c に格納されます。
- 次に、q ライブラリを使用して Add 関数をデノード化 (任意の関数を Promise を返す関数に変換するために使用されるメソッド) するか、Add 関数を Promise を返す関数に変換します。
- ここで「Add」関数を呼び出し、Add 関数を denodeify する前に実行したステップにより、戻りの Promise 値を取得できるようになりました。
- 「then」キーワードは、関数が正常に実行された場合に console.log に「Addition function completed」という文字列を表示することを指定するために使用されます。
上記のコードを実行すると、以下に示すように、console.log に「追加機能が完了しました」という出力が表示されます。
まとめ
- Node.js でコールバック関数を使用すると、欠点もあります。 開発プロセス中に、コールバック関数をネストして使用すると、コードが複雑になり、保守が困難になる場合があります。
- ネストされたコールバック関数に関する問題のほとんどは、プロミスとジェネレーターを使用することで軽減できます。 Node.jsの
- Promise は、非同期関数によって実行された処理の完了を示すために非同期関数によって返される値です。
- 非同期関数を別の非同期関数の後に呼び出す必要がある場合、Promise を互いにネストして、コードの見栄えを良くし、保守を容易にすることができます。