Promise を使用して NodeJS_node.js で非同期関数をカプセル化する
Node.js の作成プロセスでは、継続的な IO 操作が「ピラミッドの悪夢」につながる可能性があります。コールバック関数の複数のネストにより、コードの保守が困難になります。CommonJs の Promise を使用して非同期関数をカプセル化し、統合されたチェーン API を使用します。複数のコールバックの悪夢を取り除くためです。
Node.js が提供するノンブロッキング IO モデルでは、コールバック関数を使用して IO 操作を処理できますが、継続的な IO 操作が必要な場合、コールバック関数が複数回ネストされ、コードが非常に見苦しく、困難になります。また、エラー処理のための重複コード、いわゆる「破滅のピラミッド」が大量に存在する可能性があります。
step1(関数 (値1) {
Step2(値1, 関数(値2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// value4
で何かを行う });
});
});
});
これは実際には Node.js の制御フローの問題です。この問題には、async やeventProxy の使用など、多くの解決策があります。ただし、この記事のテーマは、CommonJs 仕様の Promise を使用してこれを解決することです。問題。
約束とは何ですか?
CommonJ には多くの Promise 仕様がありますが、一般的には Promise の基本的な動作を定義する Promise/A 仕様について説明します。
Promise は、通常、将来完了する可能性のある非同期操作を表すオブジェクトです。この操作は成功することも失敗することもあるため、Promise オブジェクトには通常、保留中、履行済み、拒否済みの 3 つの状態があります。それぞれ、不完全、正常に完了、および操作の失敗を表します。 Promise オブジェクトの状態が Pending から Fulfilled または Rejected に変わると、その状態を変更することはできません。
Promise オブジェクトには通常、then メソッドがあり、将来成功する可能性がある後に返される値や失敗の理由を操作できます。 then メソッドは次のようになります:
promise.then(onFulfilled, onRejected)
明らかに、then メソッドは 2 つのパラメーターを受け入れます。通常、1 つは操作が成功した後の結果を処理するために使用され、もう 1 つは操作が失敗した後の理由を処理するために使用されます。はそれぞれ成功後の結果と失敗の理由です。 then メソッドに渡されたパラメータが関数ではない場合、このパラメータは無視されます。
then メソッドの戻り値は Promise オブジェクトです。この機能により、then を連鎖呼び出ししてフローを制御する効果を得ることができます。ここには、値の転送やエラー処理など、詳細な問題が数多くあります。 Promise の仕様は次のように定義されています:
onFulfilled または onRejected 関数の戻り値は Promise オブジェクトではありません。この値は、次の then メソッドで onFulfilled の最初のパラメーターとして使用されます。戻り値が Promise オブジェクトである場合、その戻り値は次のとおりです。 then メソッドの Promise オブジェクトは?
onFulfilled 関数または onRejected 関数で例外がスローされた場合、then メソッドによって返される Promise オブジェクトのステータスは Rejected に変更されます。Promise オブジェクトが then を呼び出すと、Error オブジェクトが onRejected 関数の最初のパラメータとして使用されます。
Promise ステータスが Fulfilled になり、then メソッドに onFulfilled 関数が指定されていない場合、then メソッドによって返される Promise オブジェクトのステータスは Fulfilled になり、成功した結果は前の Promise の結果になります。これは Rejected にも当てはまります。
さらに、onFulfilled と onRejected は非同期で実行されます。
標準実装: q
上記は Promise の仕様であり、必要なのはその実装です。q は Promise/A のより優れた実装仕様を備えたライブラリです。まず、Promise オブジェクトを作成する必要があります。Promise オブジェクトの作成に関する仕様は、ここでは詳しく説明しません。コードを参照してください。
var defer = q.defer();
fs.readFile("a.txt", function(err, data){
If(err) defer.reject(err);
else defer.resolve(data);
});
return defer.promise;
}
Promise のほとんどの実装は、Promise 属性を使用して defer オブジェクトを作成することで、値の取得に成功した場合は defer.resolve(value) が呼び出され、失敗した場合は defer.reject(reason) になります。 ) が呼び出され、defer の Promise 属性が返されます。このプロセスは、defer.resolve を呼び出して Promise のステータスを Fulfilled に変更し、defer.reject を呼び出して Promise のステータスを Rejected に変更すると理解できます。
一連の連続的な非同期メソッドに直面したとき、Promise を使用して美しいコードを記述するにはどうすればよいでしょうか?以下の例を見てください。
promise0.then(関数(結果){
// 何かをする
結果を返します;
}).then(関数(結果) {
// 何かをする
Promise1 を返す; }).then(関数(結果) {
// 何かをする
}).catch(関数(例) {
console.log(ex);
}).finally(function(){
console.log("最終");
});
これは良いことのように思えます。コードはより保守しやすく、美しいものになっています。では、並行性が必要な場合はどうすればよいでしょうか?
console.log(引数);
}).then(function(){
console.log("完了");
}).catch(function(err){
console.log(err);
});
結論
この記事では主に Node.js 制御フローの問題を解決するための Promise の使用法を紹介しますが、EMCAScript6 はネイティブ API サポートを提供しており、Promise をフロントエンドに適用することもできます。 Promise が唯一の解決策ではなく、より使いやすい同時実行制御 API を提供する async も良い選択肢であることを指摘しておく必要があります。ただし、非同期メソッドで関数をカプセル化する場合には Promise の方が利点があると思います。さて、この記事はここで終わります。皆さんのお役に立てれば幸いです。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









日常生活では、約束と履行の間で問題に遭遇することがよくあります。個人的な関係でもビジネス取引でも、約束を守ることが信頼を築く鍵となります。ただし、コミットメントの是非についてはしばしば議論の余地があります。この記事では、約束の長所と短所を検討し、約束を守る方法についていくつかのアドバイスを提供します。約束されたメリットは明らかです。まず、コミットメントは信頼を築きます。人が約束を守るとき、その人は信頼できる人であると他人に信じ込ませます。信頼は人々の間に確立される絆であり、それは人々をより良くすることができます

Vue は人気のあるフロントエンド フレームワークであり、アプリケーションを開発するときにさまざまなエラーや問題に遭遇することがよくあります。このうち、Uncaught(inpromise)TypeError は一般的なエラー タイプです。この記事では、その原因と解決策について説明します。 Uncaught(inpromise)TypeError とは何ですか? Uncaught(inpromise)TypeError エラーは通常、次の場所に表示されます。

Promise.resolve() の詳細な説明には、特定のコード例が必要です。Promise は、非同期操作を処理するための JavaScript のメカニズムです。実際の開発では、順番に実行する必要があるいくつかの非同期タスクを処理する必要があることがよくあり、満たされた Promise オブジェクトを返すために Promise.resolve() メソッドが使用されます。 Promise.resolve() は Promise クラスの静的メソッドであり、

Promise オブジェクトを使用して通常の関数を Promise を返すように変更し、コールバック地獄の問題を解決します。 Promiseの成功・失敗呼び出しロジックを理解し、柔軟に調整できます。核となる知識を理解し、まずそれを使用し、ゆっくりと知識を統合して吸収します。

Promise オブジェクトの状態は次のとおりです: 1. 保留中: 初期状態、成功でも失敗でもありません; 2. 完了: 操作が正常に完了したことを意味します; 3. 拒否: 操作が失敗したことを意味します。 Promise オブジェクトが完了すると、保留状態から履行または拒否された状態に変わり、再度変更することはできません。 Promise オブジェクトは、AJAX リクエストや時間指定操作などの非同期操作を処理するために JavaScript で広く使用されています。

利点: 非同期で非ブロッキングなので、メインスレッドをブロックしません。組み込みのエラー処理メカニズムが向上します。

フロントエンド JS の学習において、誰にとっても最も不快なことは非同期の問題です。非同期やコールバック地獄などの問題を解決するには、プロミスを学ばなければなりません。ほとんどのフロントエンド プログラマーにとって、プロミスは単なる悪夢です。この記事は始まります「分かりやすいアングルから」を入り口として、誰でも簡単にプロミスをマスターできるようにします。

ブラウザの互換性: どのブラウザが Promise をサポートしていますか? Web アプリケーションの複雑さが増すにつれ、開発者は JavaScript での非同期プログラミングの問題を解決することに熱心になっています。以前は、開発者は非同期操作を処理するためにコールバック関数をよく使用していましたが、その結果、コードが複雑で保守が困難になりました。この問題を解決するために、ECMAScript6 では、非同期操作を処理するためのより直観的かつ柔軟な方法を提供する Promise を導入しました。 Promise は例外を処理するために使用されるメソッドです
