Apex メソッド結果のクライアント側キャッシュ

実行時のパフォーマンスを改善するには、@AuraEnabled(cacheable=true) アノテーションを Apex メソッドに付加して、クライアントにメソッドの結果をキャッシュします。cacheable=true を設定するには、メソッドはデータの取得のみを行う必要があり、データを変更することはできません。

メソッドをキャッシュ可能としてマークすると、サーバとの往復を待たずにクライアント側ストレージのキャッシュデータをすばやく表示できるようになり、コンポーネントのパフォーマンスが向上します。キャッシュデータが古くなっている場合、フレームワークによってサーバから最新データが取得されます。特に、待ち時間の長い接続、低速の接続、信頼性の低い接続のユーザの場合には、キャッシュが役立ちます。キャッシュ可能なメソッドはパフォーマンスが高いため、可能な場合は使用するようにしてください。

@wire を使用して Apex メソッドをコールするには、cacheable=true を設定する必要があります。

Apex メソッドを命令としてコールするには、cacheable=true を設定するように選択できます。

キャッシュ更新時間は、ストレージのエントリが更新されるまでの期間 (秒数) です。Lightning Experience と Salesforce モバイルアプリケーションでは、更新時間は自動的に設定されます。

デフォルトのキャッシュ期間は、プラットフォームの最適化で変更される可能性があります。Lightning Web コンポーネントを設計するときに、キャッシュ期間を想定しないでください。コンポーネントは、(基になるデータが変更された場合などに) キャッシュ値が無効になったことを認識すると、@salesforce/apexrefreshApex() を使用して、サーバに更新されたデータがあるかどうかを照会してキャッシュを更新できます。

lwc-recipes リポジトリの ldsDeleteRecord コンポーネントは refreshApex() をコールします。

古い Apex データを更新するには、Apex メソッドを呼び出してから notifyRecordUpdateAvailable(recordIds) をコールし、Lightning データサービス (LDS) キャッシュを更新します。命令 Apex コールによってプロビジョニングされるデータは Lightning データサービスでは管理されません。Apex メソッドを呼び出した後に notifyRecordUpdateAvailable(recordIds) をコールして、一部のレコードが古いことを Lightning データサービスに通知し、キャッシュ内のそれらのレコードを更新します。

Apex @wire を介してプロビジョニングされた Apex データを更新するには、refreshApex() をコールします。この関数は、@wire にバインドされた設定を使用してデータをプロビジョニングし、キャッシュを更新します。

refreshApex() で更新するパラメータは、以前に Apex @wire によって生成されたオブジェクトである必要があります。

場合によって、キャッシュは古くなることがあります。キャッシュが古くなっている場合、コンポーネントには最新データが必要です。サーバに更新されたデータがあるかどうかを照会してキャッシュを更新するには、refreshApex() 関数をインポートしてコールします。refreshApex() は、サーバを照会するためのネットワークの往復処理が発生するため、必要な場合にのみ呼び出します。

refreshApex() 関数は Promise を返します。Promise が解決されると、ワイヤのデータが更新されます。Apex メソッドからの戻り値は、@wire でのみ使用できます。@wire のデータは Promise が解決されると最新になりますが、Promise で解決される実際の値は無意味です。then() ブロックを使用して、更新されたデータの操作 (ページのプロパティの設定など) を行います。

  • valueProvisionedByApexWireService が、Apex @wire が付加されたプロパティまたは結び付けられた関数で受け取る引数 (関数にアノテーションを付加した場合) の場合。

例を見てみましょう。このコンポーネントには、指定された金額を超える商談のリストが表示されます。ユーザはクリックすることで、すべての商談を「成立」としてマークすることができます。商談が更新されると、キャッシュデータは古くなります。そのため、コードは商談を更新した後、refreshApex() をコールし、サーバに更新されたデータがないかどうかを照会してキャッシュを更新します。

指定された金額を超える商談のリストが表示されます。

<c-opportunities-over-amount> コンポーネントの JavaScript コードを見てみましょう。まず、refreshApex と Apex メソッドを @salesforce/apex からインポートします。

次に、動的値 (amount) を使用して Apex メソッド getOpptyOverAmount をコールします。データは、this.amount が変更されるたびに再要求されます。システムはクライアント側のキャッシュまたはサーバからデータを提供します。

コードは handleClick メソッドで refreshApex() をコールします。stage を [Closed Won (商談成立)] に変更すると、CloseDate 項目に影響します。つまり、@wire データが古くなります。今後、完了予定日が得られたときに [完了予定日] 項目が今日の日付に変更されます。

データが古いことをシステムに伝えるには、refreshApex() をコールします。ワイヤアダプタはそのキャッシュを古いとしてマークし、更新済みデータをサーバに要求し、キャッシュを更新してから、その登録者に通知します。これが実行されると、コンポーネントの this.opptiesOverAmount プロパティが更新され、新しいデータでの再表示がトリガされます。これで、完了予定日は July 18, 2019 (今日の日付) になり、商談フェーズが [Closed Won (商談成立)] になりました。

[Closed Won (商談成立)] としてマークされた商談のリストが表示されます。

OpptiesOverAmountApex クラスには、指定された金額を超える商談のリストを取得する getOpptyOverAmount メソッドが含まれます。また、updateOpptyStage メソッドも含まれます。これは、update DML 操作を使用して、指定された金額を超える商談の商談フェーズを「Closed Won (商談成立)」に更新します。

結び付けられた関数を更新するには、結び付けられた関数が受け取る引数 (結び付けられた値) を refreshApex() に渡します。このサンプルコードでは、結び付けられた関数は wiredGetActivityHistory(value) です。ワイヤサービスによりプロビジョニングされた値を保持して refreshApex() に渡します。

新しい関数を使用して、refreshApex() を命令としてコールします。プロビジョニングされた値を追跡するには、新しいプロパティ wiredActivities を定義し、そのプロパティを wiredGetActivityHistory(value) で使用します。プロビジョニングされた値を分解し、data および error オブジェクトを容易に抽出します。

関連トピック