WLOLBLOK接口被重复调用3次,如何调整为仅单次调用?
重复调用根因
你当前的逻辑里一共主动触发了3次完全相同的接口请求:
- 第1次:
initiate方法执行时调用getBlocked()触发 - 第2次:
getBlocked()的订阅回调中调用getBlocage()触发 - 第3次:
getBlocage()后面的concatMap逻辑中又调用了一次getBlocage()触发
三个请求调用的都是同一个WLOLBLOK接口、入参完全一致,属于不必要的重复调用。
优化方案
只需要调用1次接口,拿到响应结果后同时执行两个数据处理逻辑即可,修改逻辑如下:
1. 修改 file.ts 中的 initiate 方法
直接调用一次接口,替换原来的链式多次调用逻辑,多余的getBlocked、getBlocage方法如果没有其他地方使用可以直接删除:
initiate() { // 先开启加载态 this.spinners.blockDetails = true; // 仅调用一次接口 this.api.getInstrumentBlockDetail(this.currentPortfolio, this.svm) .subscribe({ next: (response) => { // 一份响应同时处理两个业务逻辑 this.prepareDataForBlocked(response); this.prepareDataForBlocage(response); }, error: (err) => { console.error('请求失败', err); this.spinners.blockDetails = false; }, complete: () => { // 请求完成关闭加载态 this.spinners.blockDetails = false; } }) }
2. 可选:如果该接口在其他地方还有多处调用,可以在service层加缓存
修改file.service.ts,增加请求缓存,避免重复发起相同请求:
import { shareReplay } from 'rxjs/operators'; // 定义缓存变量 private blockDetailCache: Observable<any[]> | null = null; getInstrumentBlockDetail(portfolioID, svm) { // 存在缓存直接返回缓存结果 if (this.blockDetailCache) { return this.blockDetailCache; } const payload = { "HEADER": this.sh.getHeaderForRequest(), "CUSTOMER": { "REFERENCE": portfolioID, "ID": "", "INTITULE1": "", "INTITULE2": "", "ACCESS": 0, "SERVICE": 0, "DEFAULTPTF": 0 }, "SVM": svm } // 发起请求并缓存结果 this.blockDetailCache = this.http.post<any[]>(this.getBaseUrl() + `/WLOLBLOK`, payload) .pipe(shareReplay(1)); return this.blockDetailCache; } // 如果需要切换投资组合/标的时清理缓存,可以新增清理方法 clearBlockDetailCache() { this.blockDetailCache = null; }
修改完成后,接口就只会被调用1次,同时不影响原有业务逻辑的执行。
内容的提问来源于stack exchange,提问作者almokhadi
相关产品推荐
相关产品推荐

