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()函数。我该怎么办?
答案 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();
}