我知道这个问题已被多次询问,但答案仍然没有解决我的问题。我有一个从json文件中获取URL的服务。
@Injectable()
export class HostConfigService {
getHostUrl()
{
return this.http.get("File path").map((response : Response) =>
response.json()); // this returns a URL ex: http://localhost:8080
}
}
我想使用来自上述网址的响应来构建多个文件中的URL,以便从角度应用程序进行休息调用。
export class GetData{
constructor(private hostConfigService: HostConfigService, private _http:
Http) { }
getData(){
this.hostConfigService.getHostUrl().subscribe((res) => this.hostUrl =
res.hostUrl); //this.hostUrl should return undefined outside subscribe
block
this.restUrl = this.hostUrl + "/getData";
return this._http.get(this.restUrl).map((response :
Response) => response.json());
}
}
也从订阅中读取getData函数的响应。我已经使用订阅内部订阅,但这给了我错误属性'订阅'类型' void'上不存在。能帮我解决一下这个问题吗?
答案 0 :(得分:3)
你应该使用环境,但如果你不想,使用你的功能的正确方法是这样的
export class GetData {
constructor(private hostConfigService: HostConfigService, private _http: Http) { }
getData() {
this.hostConfigService.getHostUrl()
.flatMap(url => this._http.get(url).map((response : Response) => response.json()));
}
}
你发出的第一个电话会是什么?一旦结果出现,你就会做第二个电话。
答案 1 :(得分:1)
由于您已从静态文件中获取主机网址,因此使用environments
在environments/environment.ts
文件中,您可以定义网址:
export const environment = {
...
hostUrl: 'www.thisismyhosturl.com',
...
};
接下来,您可以在服务中使用此变量
import { environment } from '../../../environments/environment';
export class GetData{
constructor(private _http: Http) { }
getData(){
this.restUrl = environment.hostUrl + "/getData";
return this._http.get(this.restUrl).map((response :
Response) => response.json());
}
}
使用此方法无需您hostConfigService
答案 2 :(得分:1)
谢谢@trichetriche,使用flatmap解决了我的问题。伙计们我不能使用environment.ts来存储主机URL,因为主机URL对于每个用户都是不同的,因此我需要将它们存储在assets文件夹中的静态文件中