Salesforce LWC学习(十四) Continuation进行异步callout获取数据

时间:2023-12-23 15:26:50

本篇参考:

https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex_continuations

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Continuation.htm#apex_class_System_Continuation

我们在项目中经常遇到会和后台apex进行交互通过SOQL/SOSL去获取数据展示在前台。当然,有些场景下数据是存储在外部系统,需要apex进行callout操作去获取数据展示前端。lwc针对callout操作可以简单的分成几步走,我们这里以

一. Enable Remote Site

针对外部系统的交互,我们第一步就是要先在salesforce系统中配置Remote Site,才可以访问,否则会报错。我们以https://th-apex-http-callout.herokuapp.com/这个trailhead提供的callout URL作为 remote site 的配置,这个URL返回的值为: {"trailhead":"is awesome."}

Salesforce LWC学习(十四) Continuation进行异步callout获取数据

二. 前后台构建

我们以前做callout通常通过HttpRequest,然后将设置对应的header, url , body等以后然后Http.sendRequest即可实现外部系统callout交互。在lwc中,我们需要使用 Continuation这个salesforce提供的类进行交互,具体使用和文档可以查看最上方的链接。我们在lwc和apex交互需要设置 @AuraEnabled=true,这个同样需要,在这个基础上,需要设置continuation=true,如果请求数据是固定的,可以也设置cacheable=true从而增加效率,都声明情况下写法如下

@AuraEnabled(continuation=true cacheable=true)

除了这里的小变动,另外的改变就是不用Http.sendRequest方式来构建,而是使用 Continuation方式来构建。Continuation构造函数只有一个参数,用来设置time out时间,以秒为单位。他有几个参数,continuationMethod用来设置访问以后对应的回调函数。timeout用来设置超时时间,最多120秒。state设置用来当callout操作完成并且callback方法执行完成以后的状态值。我们可以用这个状态值来确定当前的callout操作是否执行完成。Continuation有三个常用的方法:

addHttpRequest/getRequests()/getResponse()这三个方法的详情描述自行查看上方的API文档。

ContinuationDemoController类描述如下:声明startRequest方法用来callout指定的service URL,然后将response放在callback函数中进行返回。

public with sharing class ContinuationDemoController {
// Callout endpoint as a named credential URL
// or, as shown here, as the long-running service URL
private static final String LONG_RUNNING_SERVICE_URL =
'https://th-apex-http-callout.herokuapp.com/'; // Action method
@AuraEnabled(continuation=true cacheable=true)
public static Object startRequest() {
// Create continuation. Argument is timeout in seconds.
Continuation con = new Continuation(40);
// Set callback method
con.continuationMethod='processResponse';
// Set state
con.state='Hello, World!';
// Create callout request
HttpRequest req = new HttpRequest();
req.setMethod('GET');
req.setEndpoint(LONG_RUNNING_SERVICE_URL);
// Add callout request to continuation
con.addHttpRequest(req);
// Return the continuation
return con;
} // Callback method
@AuraEnabled(cacheable=true)
public static Object processResponse(List<String> labels, Object state) {
// Get the response by using the unique label
HttpResponse response = Continuation.getResponse(labels[0]);
// Set the result variable
String result = response.getBody();
return result;
}
}
continuationCmp.html:用来展示从远程服务器端的内容
<template>
<div>
service content: {formattedWireResult}
</div>
</template>

continuationCmp.js:写法上和访问apex class方法没有任何不同

import { LightningElement,wire } from 'lwc';
import startRequest from '@salesforce/apexContinuation/ContinuationDemoController.startRequest';
export default class ContinuationComponent extends LightningElement { // Using wire service
@wire(startRequest)
wiredContinuation; get formattedWireResult() {
return JSON.stringify(this.wiredContinuation);
} }

结果:将远程服务器内容转换成JSON字符串

Salesforce LWC学习(十四) Continuation进行异步callout获取数据

总结:篇中只是简单介绍了Continuation的介绍,还有很多的细节的操作和限制没有在本篇中说出,比如Continuation和DML操作前后关系等限制,相关的limitation等等。篇中有错误的地方欢迎指出,有不懂欢迎留言。