JavaScriptは非同期性によって特徴付けられます。 JavaScriptは待つことができません。待機する必要があるものを実装した場合、結果が戻ってくるのを待つことはできません。それどころか、一番下の行はコールバックコールバックを使用することです。関数を定義します。これは、結果が利用可能になるまで呼び出すことができます。
このコールバックモデルは、優れたコード組織に問題はありませんが、元のコールバックから約束に切り替えることで多くの問題を解決することもできます。約束を標準的なデータコンテナとして扱います。これにより、コード組織を簡素化し、約束ベースのアーキテクチャになります。
約束とは何ですか?
約束は、「.then()」メソッドを備えたオブジェクトであり、まだ知られていない操作の結果を表します。誰がこのオブジェクトにアクセスしても、彼は「.then()」メソッドを使用してコールバックを追加して、操作が成功した結果または障害が発生するのを待つリマインダーを待つことができます。
では、なぜこれをコールバックよりも良くすることの利点があるのでしょうか?標準のコールバックモードでは、リクエストを処理するときに同時にコールバック関数を提供する必要があります。
request(url、function(error、response){//成功またはエラーを処理します。}); dosometherelse();残念ながら、このコードは、この要求関数がそれ自体でいつ完了するかを知らないことを意味し、もちろんそれは必要ありません。最終的に結果をコールバックに渡します。これにより、複数のコールバックがネストされたコールバックまたはコールバックトラップを形成します。
querythedatabase(query、function(error、result){request(url、function(error、response){dosomeTheselse(response、function(error、result){doanotherthing(result、function(error、result){request(aterourur、function(error、response){...});});});});});});});Promiseは、低レベルのコードにリクエストを作成してからオブジェクトを返すようにすることでこの問題を解決できます。これは未完成の操作を表し、発信者がどのコールバックを追加するかを決定できるようにします。
約束とは何ですか?
約束は、非同期プログラミングの抽象化です。値を返すか、例外をスローするプロキシオブジェクトです。一般に、PromiseオブジェクトにはThenメソッドがあります。この方法は、返品値(約束の成功した実装の結果値がフルフィルメントと呼ばれる)を取得する方法です。または例外をスローします(約束を拒否する理由は拒否と呼ばれます)。次に、2つのオプションのコールバックをパラメーターとして使用します。
var promise = dosomethingaync()
Promise.then(onfulfiled、onlejected)
この約束が解決されると、つまり、非同期プロセスが完了した後、整理されていないとreferedのいずれかが呼び出されます。
したがって、約束には次の3つの異なる状態があります。
■約束される保留中 - 約束の初期状態
■実装のコミットメントを満たした - コミットメント成功した実装状態
■コミットメントの拒絶拒否 - 約束が失敗した状態
読み取りファイルをケースとして取得すると、コールバック(出力印刷)を使用してファイルを読み取った後に次のことを行う必要があります。
readfile(function(err、data){if(err)return console.error(err)console.log(data)}))ReadFile関数が約束を返す場合、次のように同じロジックを実装できます(出力印刷):
var promise = readfile()
promise.then(console.log、console.error)
ここには、非同期操作を表す価値のある約束があります。この価値の約束を常に渡すことができます。この値にアクセスした人は誰でも使用して消費できます。この値で表される非同期操作が完了するか完了していないかにかかわらず、この約束で表される非同期操作は一度だけ実行され、状態が満たされるか拒否されるため、非同期結果が変わらないことを保証することもできます。
約束を理解してください
約束は、毎日の直感とは異なる場合があります。それを理解するためには、いくつかの重要な原則を念頭に置いておく必要があります。.then()は常に新しい約束を返します。次のコードに示されているように:
var promise = readfile()
var promise2 = promise.then(readanfile、console.error)
ここで、次にパラメーターreadanfileであるConsole.Errorは、非同期操作が成功した後、または失敗が成功した後に処理されたアクションが成功した後には、頻繁に実行されるアクションを表します。つまり、ReadAnotherfile関数が実行された後、失敗した印刷レコードが正しくありません。この実装は、2つの方法でのみ可能です。
次のコードを見てみましょう。
var promise = readfile()var promise2 = promise2.then(function(data){return readantherfile()// readfileが成功した場合、readantherfile}、function(console.error){console.error(err)// readfileが成功していない場合、記録しますが、まだreadanotherfileのreadonotherfile.l. ReadAnotherfile関数の実行結果その後、約束を返すため、それは、コールバックの地獄を避けることができるシリアルチェーンをチェーンすることで約束を費やすことができることを意味します。
readfile().then(readantherfile).then(dosomethenelse).then(...)
約束ルールには分離する必要がある2つの部分があります。
(1).then()は常に新しい約束を返します。あなたがそれを呼ぶたびに、Callbackが何をするかは関係ありません。コールバックの動作は、約束の約束の実装にのみ影響します。コールバックが値を返す場合、約束はその値を使用します。この値が約束である場合、この値に対する約束の実装後に値を返します。コールバックがエラーをスローした場合、約束はエラーを拒否します。
(2).then()によって返される約束は新しい約束であり、それは.then()と呼ばれる.then()とは異なります。約束の長いチェーンは、何があっても、すべての.then()呼び出しが新しい約束を生み出すという事実を隠すことがあります。ここで注意しなければならないのは、本当に考慮する必要があるのは、最後の呼び出しが障害を表す可能性があるということです。したがって、この障害をキャッチしないと、エラーの例外が消えるのは簡単です。
一部の人々は、.then()チェーンコールは流fluentスタイルに非常に似ていると考えていますが、長い約束チェーンは混乱し、最終的に意味のある機能に分割されます。
function gettasks(){return $ http.get( 'http://example.com/api/v1/tasks').then(function(response){return respons.data;});} function getmytasks(){return gettasks().then(function(tasks){return filtertasks(tasksks(user); });}この例では、2つの関数がそれぞれ約束を取得し、コールバック関数を運びます。
興味深い約束
同じ約束は、任意の数のコールバックを受け入れることができます。約束が解決され、実装されると、すべてのコールバック関数が呼び出されます。さらに、約束は、解決および実装された後、新しいコールバックを受け入れることさえできます。これらのコールバックは通常の方法で呼び出すことができます。これにより、コールバックを使用してシンプルな形式のキャッシュを実装できます。
var taskspromise; function gettasks(){taskpromise = taskpromise || gettasksfromtheserver(); return taskpromise;}この場合、gettasks()関数は任意の回数と呼ばれることがあります。これは常に銅の歯の約束を返します。ここでは、gettasksfromtheserver()が1回のみ呼び出されます。
Nodejsの約束の使用は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。