いつもお世話になっております。
Auraのコーディングにまだ慣れておらず基本的なことかもしれませんが表題の非同期の実行順序制御についてご教示ください。
想定しているのはJavascriptで下記の組み立てを作成する場合です
for (Object data : array ) {
let ret = APEX処理(data ); // ①:for文の中でAPEX起動
function(ret); // ②:APEX処理の結果を受けての別処理
}
LWCであればjavascript側でasyncとawaitを使用出来るので①の処理をasyncで作成してretが返るまでawaitさせるだけで済むのですが、Auraの場合はasyncとawaitが使用出来ず、APEXの結果はenqueueActionの処理完了後にsetCallback内で受け取っています。
しかし上記の例で行くと①にその形で置いても、retに値が入るタイミングと②でretを渡して処理を実行するタイミングが非同期なのでこれを①が完了した後に②を実行するように制御したいです。
LWCを使用してはいけない機能があり、これをAURAで実装する必要があります。
for文の中でAPEXで実行した結果を待って処理を行う方法をご教授頂ければ幸いです。
よろしくお願い致します。
Chromeがおかしいのか、開発者コンソールが変なのかは分かりませんが右クリックをするとクラッシュするので、コントロールキーで注意深くコピーしてみました。
以下のようなクラスでそれぞれSOQLを50回と51回呼び出します。
@AuraEnabled
public static Map<String,Object> getInitSearch() {
Map<String,Object> RetMap = new Map<String,Object>();
RetMap.put('myData',getData ());
RetMap.put('myData2',getData2 ());
return RetMap;
}
そうすると、期待通りにToo Many SOQL Queries: 101になりました。
お決まりのエラーですが、ちゃんと調べてみると
太字の定義が今一つ理解できません。
- ひとつの呼び出し、または、コンテキストから発動されたトリガ内のすべての SOQL クエリは、100 の制限にカウントされます。
https://help.salesforce.com/s/articleView?id=000386220&type=1
もう少し調べてみると 一つのトランザクションって書いてありますね。
The “Too Many SOQL Queries: 101” error in Salesforce occurs when a piece of Apex code performs more than 100 SOQL (Salesforce Object Query Language) queries in a single transaction.
https://www.crsinfosolutions.com/how-to-resolve-the-too-many-soql-queries-101-error-in-salesforce/
Apexでトランザクションと言えば、以下の構文です。
try
{
}
catch (DmlException e)
{
}
そこで、先程の2つのメッソドに上記構文を追加します。
public static List<Map<String,Object>> getData () {
List<Map<String,Object>> myDataList = new List<Map<String,Object>>();
try
{
String mySOQL = 'SELECT Id,Name FROM Account Limit 1 ' ;
List<Account> myAccountList = new List<Account>();
for (Integer i = 0, j = 0; i < 50; i++) {
myAccountList = Database.query(mySOQL);
}
String Name_st ='';
Integer I = 0;
for (Account myobj : myAccountList) {
Map<String, Object> myMap = new Map<String, Object>();
myMap.put('Id',myObj.Id);
myMap.put('Name',myObj.Name);
myDataList.add(myMap);
system.debug(Logginglevel.INFO,'### whereString ############ ----> '+ myDataList );
}
}
catch (DmlException e)
{
String stackTrace = e.getStackTraceString();
if (stackTrace.contains('AnonymousBlock'))
system.debug('Execute Anonymous');
// other parsing...
}
return myDataList;
}
そうすると、51回と50回SOQLを呼び出しましたが、エラーになりません。きっとトランザクションの中で101回未満なので制限を回避できていますね。