我有两个页面,一个可以从一个导航到另一个,每个页面发出相同的http请求,完全相同的请求。显然,我不想在两页之间导航时一次又一次地发出相同的请求,所以在第一次请求发出和完成后,我将请求的响应存储在服务中。但是缺点是,http请求有时需要5-6秒才能完成,所以如果用户在请求尚未完成时导航到另一个页面,则再次发出请求。例如,有两个页面是page1和page2。用户转到page1,发出http请求,用户等待4秒,但请求尚未完成,用户转到page2,再次发出请求,用户必须再等待5秒才能看到结果。我希望http请求不会在两页之间被中断。我该怎么解决这个问题?
发布于 2019-08-08 16:31:44
我认为这将是一个很好的机会来研究一个主题。这里有一些代码可以起到这个作用,我将在下面解释它。
@Injectable()
export class ClaimsService {
private _claimsSubject = new Subject<any>(); // what every request will return
private _requestIsInProgress = false; // determines if a request is being made
constructor(private http: HttpClient) {}
public getClaims(): Observable<any> {
// check if we have a request in progress or need to make one
if (!this._requestIsInProgress) {
this._requestIsInProgress = true;
// make the request
this.http.get<any>('your apis url to get the claims')
.subscribe((claims) => {
this._requestIsInProgress = false; // request is complete
this._claimsSubject.next(claims); // emit the data
});
}
return this._claimsSubject.asObservable(); // this is returning an observable that needs to be unsubscribed from
}
}
在此服务中,您有一个总是返回主题的方法。该主题将在调用完成后发出数据。如果您进入调用,并且没有发出请求,那么我们将设置一个请求,并使用一个布尔标志来表示请求正在进行中。当该请求完成后,它将发出来自主题的结果。
无论哪种方式,调用总是返回相同的主题。
因此,在你的例子中,有人在第1页,他们要求索赔,他们得到了主题和一个请求被触发,但它尚未解决到目前为止。它们将导航到别处,请求仍在进行中,第二页现在请求相同的内容。这一请求已经在进行中,因此,他们只是被发送的主题。请求最终完成,并得到结果。
注意:唯一的问题是,您返回的主题不像http调用那样完整。所以你必须保存订阅并取消订阅。https://brianflove.com/2016/12/11/anguar-2-unsubscribe-observables/
https://stackoverflow.com/questions/57414906
复制相似问题