Continuations — Long-Running Callouts

DEX475 - Call Apex Methods

📄 第 314 页 🎬 视频课程

课程章节介绍

同学们,接下来我们聊聊在 Lightning Web Components 里处理长时间服务器调用时一个非常重要的机制——,Continuation,。 你可能会遇到这样的场景:从 LWC 发起一个 Apex 调用,但后端处理时间比较长,比如需要集成外部 API、做大批量数据处理,如果一直等着同步返回,用户界面就会被卡住,甚至超时报错。这时候,Continuation 就是我们的救星,它专门为这种,长时间运行的异步调用,设计,而且比普通的 `@wire` 或命令式的 `imperative` 调用更适合超时场景。 那 Continuation 到底怎么用呢?它的核心思路是:我们不直接等 Apex 返回结果,而是,先返回一个 Continuation 对象,,这个对象告诉平台“我要去干一件耗时的事,干完之后记得调用我这个组件的某个方法来处理结果”。平台会在后台执行你的请求,等就绪了再回调你指定的方法,整个过程界面不会阻塞。 具体在代码里怎么实现呢?首先,你需要在 LWC 里导入 continuation 方法,注意不是平时用的 `@salesforce/apex`,而是用 ,`@salesforce/apexContinuation`,。导入时,可以在这个注解里用空格分隔多个属性,比如 `(continuation=true cacheable=true)`,这样 Continuation 方法和回调就都可以被设置为可缓存的,支持 `@wire` 和命令式两种调用方式。 在 Apex 方法里,你需要创建一个 `Continuation` 对象,给它设置一个,回调方法名称,,也就是将来组件里用来接收结果的那个方法名。然后,你可以往这个 Continuation 对象上添加 HTTP 请求,最多可以加 ,3 个,。如果需要,还可以设置一个 `state` 属性,存放一些自定义数据,回调时原样返回给你。最后,Apex 方法必须返回这个 Continuation 对象。 平台收到 Continuation 后,会去执行那些 HTTP 请求,但每个请求的超时时间最长是 ,40 秒,(这个值实际上可以由管理员配置)。所以哪怕单个调用要跑很久,只要控制在 40 秒内,就有机会成功返回。 当平台处理完请求后,就会调用你在组件里定义的那个回调方法。这个回调方法会接收到两个参数:一个是,标签(label),,对应你之前添加的每个请求的标识,方便你区分是哪个请求返回了;另一个是,状态(status),,告诉你请求是成功还是失败了。在回调里,你可以调用 `Continuation.getResponse(label)` 来取出这个标签对应的响应数据,然后按需处理,比如赋值给组件属性或者触发后续逻辑。 最后,有几个关键限制你一定要记住: - 一个 Continuation 里最多只能添加 ,3 个 HTTP 请求,,不能更多。 - 这些请求是,客户端连续执行,的,也就是一个接一个,不会同时并发。 - 最重要的是,,在返回 Continuation 的那个 Apex 方法里,你不能使用 `@TestVisible` 或 `Test.loadData` 这类需要镜像测试资源的功能,,因为 Continuation 的返回值不会在方法体内即时生成测试数据(TLR 指的是 Test.loadData 相关限制)。 好,现在你对 Continuation 有了整体认识吧?简单概括就是:遇到长调用,先返回一个计划(Continuation),平台帮你异步跑,跑完通知你的回调来处理结果。这样既保证了用户体验,又能可靠地完成耗时任务。 下一节我们来看一个实际的代码例子,把这个流程串起来。有什么问题随时提。

关键词

LWC Lightning Web Components Salesforce