Es6-promises
ES6-約束
約束の構文
例
以下の例は、2つの数値を非同期的に加算する関数* add_positivenos_async()*を示しています。 正の値が渡されると、約束は解決されます。 負の値が渡されると、約束は拒否されます。
上記のコードの出力は以下のようになります-
約束の連鎖
- Promiseチェーニング*は、一連の*非同期タスク*を次々に実行するときに使用できます。 約束が別の約束の結果に依存する場合、約束は連鎖します。 これは以下の例に示されています
例
以下の例では、* add_positivenos_async()関数*は2つの数値を非同期的に加算し、負の値が渡された場合は拒否します。 現在の非同期関数呼び出しの結果は、後続の関数呼び出しにパラメーターとして渡されます。 各* then()*メソッドにはreturnステートメントがあることに注意してください。
上記のコードの出力は以下のようになります-
promiseオブジェクトのいくつかの一般的に使用されるメソッドについて、以下で詳しく説明します-
promise.all()
このメソッドは、複数のpromiseの結果を集約するのに役立ちます。
構文
- promise.all()メソッドの構文を以下に示します。ここで、 *iterable は反復可能なオブジェクトです。 E.g. アレイ。
例
以下の例では、非同期操作の配列を実行します [add_positivenos_async(10,20)、add_positivenos_async(30,40)、add_positivenos_async(50,60)] 。 すべての操作が完了すると、約束は完全に解決されます。
上記のコードの出力は次のようになります-
promise.race()
この関数は、約束の配列を取り、解決された最初の約束を返します。
構文
- promise.race()*関数の構文を以下に示します。ここで、iterableは反復可能なオブジェクトです。 E.g. アレイ。
例
以下の例では、非同期操作の配列 [add_positivenos_async(10,20)、add_positivenos_async(30,40)] を使用しています。
追加操作のいずれかが完了するたびに、promiseが解決されます。 promiseは、他の非同期操作が完了するのを待ちません。
上記のコードの出力は次のようになります-
コールバックについて
関数は、パラメーターとして別の関数に渡すことができます。 このメカニズムは*コールバック*と呼ばれます。 コールバックはイベントで役立ちます。
次の例は、この概念をよりよく理解するのに役立ちます。
上記の* notifyAll()*メソッドでは、SMSの送信と電子メールの送信によって通知が行われます。 したがって、notifyAllメソッドの呼び出し側は、2つの関数をパラメーターとして渡す必要があります。 各機能は、SMSの送信や電子メールの送信などの単一の責任を負います。
上記のコードが正常に実行されると、次の出力が表示されます。
上記のコードでは、関数呼び出しは同期的です。 これは、UIスレッドが通知プロセス全体を完了するのを待っていることを意味します。 同期コールはブロッキングコールになります。 ノンブロッキングまたは非同期呼び出しを理解しましょう。
AsyncCallbackを理解する
上記の例を考えてみましょう。
スクリプトを有効にするには、notifyAll()メソッドの非同期呼び出しまたは非ブロッキング呼び出しを実行します。 JavaScriptの* setTimeout()*メソッドを使用します。 このメソッドはデフォルトで非同期です。
setTimeout()メソッドは2つのパラメータを取ります-
- コールバック関数。
- メソッドが呼び出されるまでの秒数。
この場合、通知プロセスはタイムアウトでラップされています。 したがって、コードで設定された2秒の遅延がかかります。 notifyAll()が呼び出され、メインスレッドは他のメソッドを実行するように進みます。 したがって、通知プロセスはメインのJavaScriptスレッドをブロックしません。
上記のコードが正常に実行されると、次の出力が表示されます。
複数のコールバックの場合、コードは恐ろしく見えます。
ES6は、Promiseの概念を導入することにより、あなたを助けます。 プロミスは「継続イベント」であり、複数の非同期操作をよりクリーンなコードスタイルで一緒に実行するのに役立ちます。
例
例でこれを理解しましょう。 以下は同じ構文です。
promiseを実装するための最初のステップは、promiseを使用するメソッドを作成することです。 この例では、* getSum()*メソッドは非同期です。つまり、その操作は他のメソッドの実行をブロックしてはいけません。 この操作が完了するとすぐに、呼び出し元に通知します。
次の例(ステップ1)は、Promiseオブジェクト「var promise」を宣言しています。 Promise Constructorは、作業が正常に完了するために最初に機能を使用し、エラーが発生した場合に別の機能を使用します。
promiseは、resolveコールバックを使用して結果を渡すことにより、計算の結果、つまりn1 + n2を返します。
- ステップ1 *-resolve(n1 + n2);
getSum()でエラーまたは予期しない状態が発生した場合、Promiseでリジェクトコールバックメソッドを呼び出し、エラー情報を呼び出し元に渡します。
- ステップ2 *-reject(Error( "Negatives not supported"));
メソッドの実装は、次のコードに記載されています(ステップ1)。
2番目のステップでは、呼び出し元の実装について詳しく説明します(ステップ2)。
呼び出し元は「then」メソッドを使用する必要があります。このメソッドは、成功と失敗の2つのコールバックメソッドを取ります。 次のコードに示すように、各メソッドは1つのパラメーターを取ります。
上記のコードが正常に実行されると、次の出力が表示されます。
getSum()の戻り値の型はPromiseであるため、実際には複数の「then」ステートメントを使用できます。 最初の「then」にはreturnステートメントがあります。
上記のコードが正常に実行されると、次の出力が表示されます。
次の例では、getSum()メソッドを使用して3つのthen()呼び出しを発行します。
上記のコードが正常に実行されると、次の出力が表示されます。
プログラムは最初に「スクリプトの終わり」を表示し、次にgetSum()メソッドを呼び出して結果を1つずつ表示します。
これは、getSum()が非同期スタイルまたは非ブロックスタイルで呼び出されることを示しています。 Promiseは、コールバックに対処するためのすてきできれいな方法を提供します。