【发布时间】:2021-09-11 13:59:46
【问题描述】:
我正在使用 Angular 编写此应用程序,并且正在使用解析器。
一旦用户加载给定页面,就会有一个 API-Endpoint 将被解析器命中,并且需要传递的参数之一是用户所在的国家/地区。为了获取该信息,我使用了 ip-api.com API。
这是我的问题。因为我使用的是 Observables,所以在请求发出之前,我无法按时获取国家/地区位置。我需要先知道用户所在的国家,然后再发送请求。
我的想法是创建一个注入root 的服务,以便在应用程序启动时,它的构造函数立即执行一个方法来获取用户位置数据。然后,我将该数据存储在 BehaviorSubject 上,以便以后需要它的任何类都可以访问它。
如何确保在任何请求发出之前我始终拥有所需的数据?
如果用户来自主页面,一切正常,但如果用户直接进入辅助页面,则会出现错误。
这是我得到的:
助手服务
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { take } from 'rxjs/operators';
@Injectable( { providedIn: 'root' } )
export class HelperService {
public showRightDrawer = new BehaviorSubject<boolean>(false);
public requestCountry = new BehaviorSubject<string>(undefined);
constructor(private http: HttpClient) {
this.detectUserLocation();
}
detectUserLocation(): void {
const url = 'http://ip-api.com/json';
this.http.get(url).pipe(take(1)).subscribe((c: any) => {
const cc = c.countryCode;
this.requestCountry.next(cc);
return cc;
});
}
}
访问我的内部 API 的服务
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { take } from 'rxjs/operators';
import { SERVER_URL } from 'src/environments/environment';
import { HelperService } from '../common/services/helper.service';
import { Roaster } from './roaster.interface';
@Injectable()
export class RoasterService {
private endPoint: string = SERVER_URL;
private country: string;
private httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
responseType: 'text'
})
};
constructor(private httpService: HttpClient, private helper: HelperService) {
helper.requestCountry.subscribe((c) => this.country = c);
}
getRoasters(page?: number, limit?: number): Observable<Roaster[]> {
const reqLimit = limit || 15;
const reqPage = page || 0;
return this.httpService
.get<Roaster[]>(`${this.endPoint}roaster?limit=${reqLimit}&page=${reqPage}&country=${this.country.toLowerCase()}`, this.httpOptions )
.pipe(take(1));
}
}
【问题讨论】:
标签: angular rxjs angular2-observables