订阅async get请求的响应将在另一个get请求中使用

时间:2017-11-09 09:20:20

标签: angular angular2-services

我知道这个问题已被多次询问,但答案仍然没有解决我的问题。我有一个从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'上不存在。能帮我解决一下这个问题吗?

3 个答案:

答案 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文件夹中的静态文件中