订阅方法返回未定义

时间:2019-06-07 12:24:09

标签: angular typescript api ionic-framework

 get() {
    const obs = this.http.get(this.url);
    obs.subscribe((response) => {this.sakla = response; 
  });

 constructor(private geolocation: Geolocation,public http: HttpClient) {

 }

 ngOnInit() {
    this.get(); 
    console.log(this.sakla); //x line 
 }

在ngOnInit()之后,该get()函数已完成。所以x行给出了undefined,因为在ngoninit中没有完全执行this.get()函数。我该怎么办?

2 个答案:

答案 0 :(得分:2)

让我对其进行标记以澄清您的查询:

get(){
// step 3
    const obs = this.http.get(this.url);
    obs.subscribe((response) => {
      // stpe 5
      this.sakla = response; 
    });

constructor(private geolocation: Geolocation,public http: HttpClient) { // step 1  }

ngOnInit(){
// step 2
    this.get(); 
// step 4
    console.log(this.sakla); //x line
 }

未定义的原因是“ http.get()”本质上是异步的,也就是说,直到您收到响应之前,您的代码将已经执行“ console.log()”,因此,您将变得未定义。 / p>

要纠正此错误,可以执行以下操作:

a)从get方法返回可观察的结果,并在ngOnit方法中进行订阅

b)在get方法定义以及this.get()调用中使用async-await

c)将其转换为承诺并在收到响应时解决承诺。

d)简单地,仅登录内部订阅方法

干杯(y)

答案 1 :(得分:1)

您的get函数是一个异步函数。浏览器将启动HTTP请求,然后立即执行console.log。

在您的订阅处理程序中移动console.log以查看结果。

get() {
    const obs = this.http.get(this.url);

    obs.subscribe((response) => {
        this.sakla = response;

        console.log(this.sakla); //x line
    });

constructor(private geolocation: Geolocation,public http: HttpClient) {}


ngOnInit(){
    this.get();
}