[Salesforce]JavaScript Promise の使用

JavaScript Promise の使用

JavaScript コードで ES6 Promise を使用できます。Promise により、非同期コールの成否を処理するコードや、複数の非同期コールをまとめてチェーニングするコードを簡素化できます。

ブラウザでネイティブバージョンが提供されない場合は、フレームワークがポリフィルを使用するため、Promise は Lightning Experience でサポートされるすべてのブラウザで機能します。

ここでは、Promise の基本を十分に理解していることを前提としています。Promise のわかりやすい概要については、https://developers.google.com/web/fundamentals/getting-started/primers/promises を参照してください。

Promise は省略可能な機能です。Promise を愛用している人もいれば、そうでない人もいます。各自の使用事例にとって有用であれば利用します。

Promise の作成

次の firstPromise 関数は、Promise を返します。

firstPromise : function() {
    return new Promise($A.getCallback(function(resolve, reject) {
      // do something
    
      if (/* success */) {
        resolve("Resolved");
      }
      else {
        reject("Rejected");
      }
    }));
}

この Promise のコンストラクタが、Promise で resolve() または reject() をコールする条件を決定します。

Promise のチェーニング

複数のコールバックを連携させたり、まとめてチェーニングしたりする必要があるときは Promise が役立ちます。汎用的なパターンは次のとおりです。

firstPromise()
    .then(
        // resolve handler
        $A.getCallback(function(result) {
            return anotherPromise();
        }),

        // reject handler
        $A.getCallback(function(error) {
            console.log("Promise was rejected: ", error);
            return errorRecoveryPromise();
        })
    )
    .then(
        // resolve handler
        $A.getCallback(function() {
            return yetAnotherPromise();
        })
    );

then() メソッドは、複数の Promise をチェーニングします。この例では、各解決ハンドラが別の Promise を返します。

then() は Promise API の一部です。次の 2 つの引数を取ります。

  1. 達成された Promise のコールバック (解決ハンドラ)
  2. 却下された Promise のコールバック (却下ハンドラ)

1 つ目のコールバック function(result) は、Promise コンストラクタで resolve() がコールされたときにコールされます。コールバックの result オブジェクトは、resolve() への引数として渡されるオブジェクトです。

2 つ目のコールバック function(error) は、Promise コンストラクタで reject() がコールされたときにコールされます。コールバックの error オブジェクトは、reject() への引数として渡されるオブジェクトです。

この例では、2 つのコールバックが $A.getCallback() でラップされています。どういうことでしょうか? Promise はその resolve 関数と reject 関数を非同期に実行するため、コードは Lightning イベントループおよび通常の表示ライフサイクルの外側に存在します。resolve または reject のコードによって、コンポーネント属性の設定など、Lightning コンポーネントフレームワークに何らかのコールを実行する場合は、$A.getCallback() を使用してコードをラップします。詳細は、「フレームワークのライフサイクル外のコンポーネントの変更」を参照してください。

catch() または却下ハンドラを常に使用

1 つ目の then() メソッドの却下ハンドラは、errorRecoveryPromise() が設定された Promise を返します。却下ハンドラは多くの場合、Promise チェーンの「中流」で使用され、エラー回復メカニズムをトリガします。

Promise API には、必要に応じて未処理のエラーを検出する catch() メソッドが含まれます。Promise チェーンには常に拒否ハンドラまたは catch() メソッドを含めます。

Promise でエラーが発生しても、フレームワークがグローバルエラーハンドラを設定する window.onerror はトリガされません。catch() メソッドがない場合は、開発時に、ブラウザのコンソールに Promise の未検出エラーに関するレポートがないか注意します。catch() メソッドにエラーメッセージを表示するには、$A.reportError() を使用します。catch() の構文は次のとおりです。

promise.then(...)
    .catch(function(error) {
        $A.reportError("error message here", error);
    });

catch() についての詳細は、「Mozilla Developer Network」を参照してください。

Promise で保存可能なアクションを使用しない

フレームワークは、保存可能なアクションの応答をクライアント側のキャッシュに保存します。この保存された応答によってアプリケーションのパフォーマンスが大幅に向上し、一時的にネットワークに接続されていないデバイスをオフラインで使用できるようになります。保存可能なアクションが適しているのは参照のみのアクションだけです。

保存可能なアクションのコールバックが複数回呼び出されていることがあります。この場合、初回はキャッシュされたデータが使用され、それ以降はサーバからの更新済みデータが使用されます。Promise は解決または却下を 1 回のみ行うものであるため、複数の呼び出しは Promise に適していません。

[Salesforce]JavaScript Remoting の制限および考慮事項

JavaScript Remoting の制限および考慮事項

JavaScript Remoting の制限および考慮事項

JavaScript Remoting はリソース制限の対象ではありませんが、機能自体に制限があります。

JavaScript Remoting は、Salesforce のサービス制限を回避するための手段ではありません。JavaScript Remoting コールには、API 制限は適用されませんが、JavaScript Remoting を使用する Visualforce ページには、すべての標準 Visualforce の制限が適用されます。

デフォルトでは、リモートコールの応答は、30 秒以内に返される必要があります。これを超えると、コールはタイムアウトになります。要求の完了にこれ以上の時間を必要とする場合は、長いタイムアウトを 120 秒以内で設定します。 リモートコールの応答の最大サイズは 15 MB です。JavaScript Remoting コードがこの制限を超える場合は、次のように対応できます。

  • 各要求の応答サイズを削減する。必要なデータのみを返します。
  • 大量データの取得を、小さなチャンクを返す複数の要求に分割する。
  • バッチ要求の使用頻度を上げ、個々のバッチサイズを削減する。
  • バッチ以外の要求を使用する。Remoting 要求の設定ブロックで { buffer: false } と設定します。

[Salesforce]PDFファイルを作成して、Salesforceメールテンプレートに添付

PDFファイルを作成して、Salesforceメールテンプレートに添付

Visualforceメールテンプレ―ド:

<messaging:emailTemplate subject="test: {!relatedTo.name}" recipientType="Contact" relatedToType="Opportunity">

    <messaging:plainTextEmailBody >
        添付送付させていただきます。
        ご確認お願いいたします。
    </messaging:plainTextEmailBody>

    <messaging:htmlEmailBody >
    <html>
        <body>
            <p>添付送付させていただきます。</p>
            <p>ご確認お願いいたします。</p>
        </body>
    </html>
    </messaging:htmlEmailBody>

    <messaging:attachment renderAs="PDF" filename="Invoice.pdf">
        <c:OppAttachmentComponent opportunityId="{!relatedTo.Id}" opportunity="{!relatedTo}"/>
   </messaging:attachment>
</messaging:emailTemplate>

Component : OppAttachmentComponen

<apex:component controller="OppAttachmentComponentController" access="global" >
    <apex:attribute name="opportunityId" description="OpportunityId" assignTo="{!OpportunityId}" type="Id" />       

    test
    {!opportunity.Name}

</apex:component>

commponent controller : OppAttachmentComponentController

global class OppAttachmentComponentController {

    global String OpportunityId{ 
        get;
        set {
            UpdateContents2(value);
        } 
    }

     public void UpdateContents2(String OpportunityId) {

         if (OpportunityId != null) {
            List<Opportunity> oppList = [SELECT Id FROM Opportunity WHERE Id =:OpportunityId];

        }
    }

}

[Salesforce]JavaScript Remoting 要求の設定

JavaScript Remoting 要求の設定

要求のタイムアウト (ミリ秒単位)。デフォルトは 30,000 (30 秒) です。最大値は 120,000 (120 秒 = 2 分) です。120秒に設定方法例は以下です。

<script type="text/javascript">

    Visualforce.remoting.timeout = 120000; // Set timeout at page level

    function getRemoteAccount() {
        var accountName = document.getElementById('acctSearch').value;

        // This remoting call will use the page's timeout value
        Visualforce.remoting.Manager.invokeAction(
            '{!$RemoteAction.AccountRemoter.getAccount}',
            accountName, 
            handleResult
        );
    }

    function handleResult(result, event) { ... }
</script>

[Salesforce]カスタムアクション制限事項

カスタムアクション制限事項

https://developer.salesforce.com/docs/atlas.ja-jp.case_feed_dev.meta/case_feed_dev/case_feed_dev_guide_custom_publishers.htmアクションの選択および設定にページレイアウトエディタを使用することを選択した場合は、まずカスタムアクションを作成する必要があります。

  1. ケースのオブジェクト管理設定から、[ボタン、リンク、およびアクション] に移動します。
  2. [新規アクション] をクリックします。
  3. [カスタム Visualforce] を選択します。
  4. 作成した Visualforce ページを選択してから、アクションウィンドウの高さを指定します。(幅は固定です)。
  5. アクションの表示ラベルを入力します。これは、パブリッシャーでアクションについてユーザに表示されるテキストです。
  6. 必要に応じて、アクションの名前を変更します。
  7. アクションの説明を入力します。説明は、アクションの詳細ページと、[ボタン、リンク、およびアクション] ページのリストに表示されます。説明はユーザに表示されません。
  8. 必要に応じて、[変更アイコン] をクリックして、アクションに別のアイコンを選択します。このアイコンは、API を介してアクションを使用する場合にのみ表示されます。

[Salesforce][Reference url]Visualforceアクションヘッダー非表示

[Reference url]Visualforceアクションヘッダー非表示

<apex:page docType="html-5.0" standardController="Campaign"  extensions="testController" title="testCreate" showHeader="true" showQuickActionVfHeader="false" sidebar="false" id="testyCreate">

上記の、showQuickActionVfHeader="false"にすることで、アクションヘッダー非表示

[Salesforce]outputPanelのrendered属性

outputPanelのrendered属性

<apex:commandButton reRender="page1,page2" value="Search"/>
<br/>

<apex:OutputPanel id="page1">
	<apex:OutputPanel rendered="{!isDone}">
	<apexageBlock title="title1">
	   title1
	</apex:PageBlock>
	</apex:OutputPanel>
</apex:OutputPanel>


<apex:OutputPanel id="page2">
	<apex:OutputPanel rendered="{!NOT(isDone)}">
	<apex:PageBlock title="title2">
	   title2
	</apex:PageBlock>
	</apex:OutputPanel>
</apex:OutputPanel>