zoukankan      html  css  js  c++  java
  • 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等等。篇中有错误的地方欢迎指出,有不懂欢迎留言。

  • 相关阅读:
    误删表空间处理办法
    一步步开发网站系列-网站界面
    webstorm ftp发布问题
    TP5接受Vue跨域请求
    tp5上传图片添加永久素材到微信公众号
    将博客搬至CSDN
    swoole http_server 多进程并使用多进程处理消息
    高并发下,php与redis实现的抢购、秒杀功能
    SVN服务器搭建
    web服务器安全笔记
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/12560076.html
Copyright © 2011-2022 走看看