JavaScriptの非同期プログラミングは、誰でも徐々に受け入れられています。以前は、人々は通常、コールバックネスト、Setimeout、SetIntervalなどを通じて実装していました。コードは非常に直感的ではないように見え、コードロジック全体を見ずにすぐに理解することは困難です。 JavaScriptの非同期関数には、I/O関数(Ajax、Postmessage、IMG Load、Script Loadなど)、タイミング関数(SetimeOut、SetInterval)などが含まれます。
私たちは皆、これらに精通しています。複雑なアプリケーションでは、多くの場合、ネストの複数の層があり、いくつかの手順が完了しておらず、プログラムの例外が発生していると考えています。最も簡単な例は、たとえば、ノードをDOMに挿入する場合、ノードを注入してノードを操作するのを待つ必要があります。多数のノードが注入されると、時間を把握することはしばしば困難です。サードパーティAPIのデータに依存するコードがある場合。 API応答がどれほど遅延であるかを知ることはできず、アプリケーションの他の部分が結果を返すまでブロックされる可能性があります。約束はこの問題に対するより良い解決策を提供します。それは非ブロッキングであり、コードから完全に分離されています。
JavaScriptの非同期プログラミングを見てみましょう。まず第一に、比較的人気のある約束/仕様を見ることをお勧めします。
約束/仕様
注:理解を容易にするために、説明は約束/A仕様とは異なる場合があります。
CommonJSの約束/仕様は、APIインターフェイスを標準化して非同期ロジックコードを理解しやすくすることにより、非同期プログラミングを簡素化します。
約束/A仕様の実装を呼び出します。 Promiseオブジェクトには3つの状態しかありません。当初は満たされていない状態で作成されており、状態は満たされていないか、失敗した(失敗/拒否された)に満たされていないように変更することができます。状態が満たされる(完了)または失敗(失敗/拒否された)が、州はこれ以上変更できなくなります。
約束/A仕様は、プログラムの遅延(または将来)の概念を説明するソリューションを提供します。主なアイデアは、メソッドを実行してから、アプリケーションをブロックして結果が戻るのを待ってから、他のメソッドを呼び戻すことではなく、将来のリスニングを満たすために約束のオブジェクトを返すことです。満たされた状態と失敗した状態の両方が聞くことができます。 Promiseは、Thenインターフェイスを実装してPromiseオブジェクトを返すことにより、コールバックをレジスタにします。
コードコピーは次のとおりです。次のとおりです(fulfilledhandler、errorhandler、progresshandler);
次に、インターフェイスを使用して、約束のさまざまな状態をリッスンします。充実したハンドラーは、充実した状態を聴くために使用され、エラーハンドラーは失敗した状態を聞くために使用され、進行状態のハンドラーは、満たされていない状態を聞くために使用されます。約束は、満たされていないイベントのリスニングを強制しません(たとえば、jQuery(1.5、1.6)の古いバージョンの延期は約束の実装であるが、前後にリスニングされていない状態を実装していないことを知っています。
一般に、Thenインターフェイスは、元のPromiseオブジェクトではなく、新しいPromiseオブジェクトを返すと考えられています。この新しいPromiseオブジェクトは、元のPromiseオブジェクトのビューとして理解できます。元のPromiseオブジェクトの一連のメソッドのみが含まれています。これらの方法は、元のPromiseオブジェクトのステータスのみを観察することができますが、繰延オブジェクトの内部状態を変更することはできません。これにより、複数の発信者間の競合を回避できます。これにより、他の発信者に影響を与えることなく、新しいPromiseオブジェクトの状態を変更できます。
さらに、Promiseは、Resolve(未完成から完了までの実装状態)と拒否(未完成から拒否または拒否への実装状態)を実装する2つのインターフェイスを提供します。
理解するために写真を送ってください:
約束があれば、同期の考え方で非同期ロジックを書くことができます。非同期関数では、Try/Catchを使用して例外をキャッチすることはできず、例外をスローすることはできません。約束があれば、例外をキャッチするのと同等のエラーハンドラーを直接明示的に定義できます。
以下は、q、rsvp.js、jquery.deferredなど、約束/A仕様に従ういくつかのクラスライブラリです。