JavaScript Promise の使用
ブラウザでネイティブバージョンが提供されない場合は、フレームワークがポリフィルを使用するため、プロミスは Lightning Experience でサポートされるすべてのブラウザで機能します。
ここでは、プロミスの基本を十分に理解していることを前提としています。プロミスのわかりやすい概要については、https://developers.google.com/web/fundamentals/getting-started/primers/promisesを参照してください。
プロミスは省略可能な機能です。プロミスを愛用している人もいれば、そうでない人もいます。各自の使用事例にとって有用であれば利用します。
複数のコールバックを連携させたり、まとめてチェーニングしたりする必要があるときはプロミスが役立ちます。汎用的なパターンは次のとおりです。
1somePromise()
2 .then(
3 // resolve handler
4 $A.getCallback(function(result) {
5 return anotherPromise();
6 }),
7
8 // reject handler
9 $A.getCallback(function(error) {
10 console.log("Promise was rejected: ", error);
11 return errorRecoveryPromise();
12 })
13 )
14 .then(
15 // resolve handler
16 $A.getCallback(function() {
17 return yetAnotherPromise();
18 })
19 );somePromise() は Promise を返します。このプロミスのコンストラクタが、プロミスで resolve() または reject() をコールする条件を決定します。
then() メソッドは、複数のプロミスをチェーニングします。この例では、各解決ハンドラが別のプロミスを返します。
then() は Promise API の一部です。次の 2 つの引数を取ります。
- 達成されたプロミスのコールバック (解決ハンドラ)
- 却下されたプロミスのコールバック (却下ハンドラ)
1 つ目のコールバック function(result) は、プロミスコンストラクタで resolve() がコールされたときにコールされます。コールバックの result オブジェクトは、resolve() への引数として渡されるオブジェクトです。
2 つ目のコールバック function(error) は、プロミスコンストラクタで reject() がコールされたときにコールされます。コールバックの error オブジェクトは、reject() への引数として渡されるオブジェクトです。
catch() または却下ハンドラを常に使用
1 つ目の then() メソッドの却下ハンドラは、errorRecoveryPromise() が設定されたプロミスを返します。却下ハンドラは多くの場合、プロミスチェーンの「中流」で使用され、エラー回復メカニズムをトリガします。
Promise API には、必要に応じて未処理のエラーを検出する catch() メソッドが含まれます。プロミスチェーンには常に拒否ハンドラまたは catch() メソッドを含めます。
プロミスでエラーが発生しても、フレームワークがグローバルエラーハンドラを設定する window.onerror はトリガされません。catch() メソッドがない場合は、開発時に、ブラウザのコンソールにプロミスの未検出エラーに関するレポートがないか注意します。catch() メソッドにエラーメッセージを表示するには、$A.reportError() を使用します。catch() の構文は次のとおりです。
1promise.then(...)
2 .catch(function(error) {
3 $A.reportError("error message here", error);
4 });catch() についての詳細は、「Mozilla Developer Network」を参照してください。
プロミスで保存可能なアクションを使用しない
フレームワークは、保存可能なアクションの応答をクライアント側のキャッシュに保存します。この保存された応答によってアプリケーションのパフォーマンスが大幅に向上し、一時的にネットワークに接続されていないデバイスをオフラインで使用できるようになります。保存可能なアクションが適しているのは参照のみのアクションだけです。
保存可能なアクションのコールバックが複数回呼び出されていることがあります。この場合、初回はキャッシュされたデータが使用され、それ以降はサーバからの更新済みデータが使用されます。プロミスは解決または却下を 1 回のみ行うものであるため、上記の動作はプロミスに適していません。