要解决Angular自定义服务被无限循环调用的问题,我们可以使用依赖注入和单例模式来确保服务只被实例化一次。以下是一个可能的解决方案:
首先,创建一个新的Angular服务,例如DataService
,用于处理数据请求和处理逻辑。在DataService
中,我们创建一个私有变量isFetchingData
,用于检查是否正在获取数据。我们还创建一个公共方法getData()
,用于获取数据:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class DataService {
private isFetchingData: boolean = false;
constructor(private http: HttpClient) {}
getData() {
if (!this.isFetchingData) {
this.isFetchingData = true;
return this.http.get('api/data').pipe(
finalize(() => {
this.isFetchingData = false;
})
);
} else {
return of(null);
}
}
}
然后,我们在需要使用数据的组件中注入DataService
服务,并在ngOnInit
方法中调用getData()
方法获取数据:
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-my-component',
template: `
`,
})
export class MyComponent implements OnInit {
data$;
constructor(private dataService: DataService) {}
ngOnInit() {
this.data$ = this.dataService.getData();
}
}
这样,当多个组件同时调用getData()
方法时,只有一个组件会真正触发数据请求,其他组件会得到null
作为响应。这样就避免了无限循环调用的问题。
请注意,以上示例中使用了HttpClient
模块来发送HTTP请求,并使用了async
管道来处理异步数据流。确保在使用之前,将HttpClientModule
添加到应用的根模块中。
希望以上解决方案能帮助到您解决Angular自定义服务被无限循环调用的问题!
下一篇:Angular自定义管道参数