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

本篇参考:

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."}

 二. 前后台构建

我们以前做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字符串

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

posted @ 2020-03-29 20:17  zero.zhang  阅读(1474)  评论(0编辑  收藏  举报