ホームページ ウェブフロントエンド jsチュートリアル Promise を使用して NodeJS_node.js で非同期関数をカプセル化する

Promise を使用して NodeJS_node.js で非同期関数をカプセル化する

May 16, 2016 pm 04:13 PM
promise

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("最終");
});

上記のコードでは、then メソッドは OnFulfilled のみを受け入れ、catch メソッドは実際には then(null, OnRejected) です。この場合、一連の非同期メソッドが常に正常に値を返す限り、コードは次のようになります。下向きに実行すると、非同期メソッドのいずれかが失敗するか例外が発生した場合、CommonJs Promise 仕様に従って、catch 内の関数が実行されます。 q には、finally メソッドも用意されています。これは文字通りに理解するのが簡単です。つまり、resolve または拒否に関係なく、finally の関数が実行されます。

これは良いことのように思えます。コードはより保守しやすく、美しいものになっています。では、並行性が必要な場合はどうすればよいでしょうか?

コードをコピーします コードは次のとおりです:
q.all([約束0, 約束1, 約束2]).spread(function(val0, val1, val2){
console.log(引数);
}).then(function(){
console.log("完了");
}).catch(function(err){
console.log(err);
});

Q は同時実行用の API も提供します。all メソッドを呼び出して Promise 配列を渡して、そのチェーン スタイルの使用を継続します。 Node.jsのネイティブAPIをPromiseに変換してコード形式を統一できるq.nfbindなどもあり、これも非常に優れています。その他の API については、ここでは詳しく説明しません。

結論

この記事では主に Node.js 制御フローの問題を解決するための Promise の使用法を紹介しますが、EMCAScript6 はネイティブ API サポートを提供しており、Promise をフロントエンドに適用することもできます。 Promise が唯一の解決策ではなく、より使いやすい同時実行制御 API を提供する async も良い選択肢であることを指摘しておく必要があります。ただし、非同期メソッドで関数をカプセル化する場合には Promise の方が利点があると思います。

さて、この記事はここで終わります。皆さんのお役に立てれば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

約束を守る: 約束を守ることの長所と短所 約束を守る: 約束を守ることの長所と短所 Feb 18, 2024 pm 08:06 PM

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

Vue アプリケーションで Uncaught (in Promise) TypeError が発生した場合はどうすればよいですか? Vue アプリケーションで Uncaught (in Promise) TypeError が発生した場合はどうすればよいですか? Jun 25, 2023 pm 06:39 PM

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

Promise.resolve() について詳しく見る Promise.resolve() について詳しく見る Feb 18, 2024 pm 07:13 PM

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

ES6 Promiseの原理と利用方法の分析例 ES6 Promiseの原理と利用方法の分析例 Aug 09, 2022 pm 03:49 PM

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

プロミスオブジェクトとは何ですか? プロミスオブジェクトとは何ですか? Nov 01, 2023 am 10:05 AM

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

PHP 関数が Promise オブジェクトを返す利点は何ですか? PHP 関数が Promise オブジェクトを返す利点は何ですか? Apr 19, 2024 pm 05:03 PM

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

この記事 1 つで Promise を簡単にマスターできます この記事 1 つで Promise を簡単にマスターできます Feb 10, 2023 pm 07:49 PM

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

どのブラウザが Promise をサポートしていますか? どのブラウザが Promise をサポートしていますか? Feb 19, 2024 pm 04:41 PM

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

See all articles