如何摆脱Angular 6服务中的冗余请求?

时间:2018-12-11 17:29:28

标签: angular angular6

我在代码中有3个独立的位置,它们调用VerificationService方法getOrganizationView()

getOrganizationView(): Observable<any> {
  return this.httpClient.http.post(...)
}

第一名是主要服务

@Injectable()
export class Principal {
   constructor(private verificationService: VerificationService) {}
   identity(force?: boolean): Promise<any> {
      return this.verificationService.getOrganizationView().toPromise().then((response ) => {
          ...
      })
   }
}

还有一项名为LinkAccessService的服务,其执行的Principal并不是重点

还有一个地方是组件:

export class VerificationComponent implements OnInit {
   constructor(private verificationService: VerificationService) {
   }

   ngOnInit() {
     this.verificationService.getOrganizationView()
       .subscribe((data: VerificationView) => {
         ...
     });
  }
}

在加载应用程序时,我只有3个调用,而不是单个请求,但是这些实体是绝对独立的,并且我无法像组件指令之间共享数据,等等。

在Angular 2+中,传统上如何解决这样的问题? 我不是要提供明确的答案代码,而是要有主意。

3 个答案:

答案 0 :(得分:3)

最简单的缓存数据的方法是使用shareReplay rxjs运算符:

import { shareReplay } from 'rxjs/operators';

@Injectable()
export class VerificationService {
  organizationViewCache$: Observable<any>;

  getOrganizationView() {
    if (!this.organizationViewCache$) {
      this.organizationViewCache$ = this.http.get(...).pipe(shareReplay(1));
    }

    return this.organizationViewCache$;
  }
}

另请参阅:

答案 1 :(得分:2)

您可以构建一个检索和缓存数据的服务。然后,注入服务的任何组件都可以访问该缓存的数据,而无需对服务器的另一个请求。

export class ProductService {
    private productsUrl = 'api/products';
    products: IProduct[];

    getProducts(): Observable<IProduct> {
        // Returns the cached list if it exists.
        if (this.products) {
            return of(this.products);
        }
        return this.http.get<IProduct[]>(this.productsUrl)
                        .pipe(
                            tap(data => this.products = data),
                            catchError(this.handleError)
                        );
    }
}

还有其他几种答案,包括在此处使用RxJS ReplaySubjectWhat is the correct way to share the result of an Angular Http network call in RxJs 5?

答案 2 :(得分:0)

我不确定100%如何设置您的应用。但是如果我是您,我会考虑使用Event Emitter。您可以让它发出一个事件,您的不同组件可以监听。应该调用的组件中的任何一个都将使其正确,而其他组件则不应。