无论我做啥,变量都是未定义的[重复]

Posted

技术标签:

【中文标题】无论我做啥,变量都是未定义的[重复]【英文标题】:Variable is undefined no matter what I do [duplicate]无论我做什么,变量都是未定义的[重复] 【发布时间】:2020-03-07 21:45:57 【问题描述】:

我正在尝试使用 Angular 8 调用我的 API 并将 JSON 响应记录到控制台中,但无论我做什么,控制台都会显示某些内容未定义并且没有记录其他任何内容。

组件:

import  Component, OnInit  from '@angular/core';
import  Observable  from 'rxjs';
import  HttpdaService  from '../httpda.service';
import  Kbs  from '../kbs';

@Component(
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
)
export class HomeComponent implements OnInit 
  observableKbs: Observable<any[]>;
  kbs: Kbs[];

  constructor(private http: HttpdaService)  

  ngOnInit() 
    this.getKbs();
    console.log(this.kbs);
  

  getKbs() 
    this.observableKbs = this.http.getKbs();
    this.observableKbs.subscribe(
      kbs => this.kbs = kbs,
      err => this.http.checkErr(err)
    );
    return this.kbs;
  

服务:

import  Injectable  from '@angular/core';
import  HttpClient, HttpErrorResponse  from '@angular/common/http';
import  Observable  from 'rxjs';
import  Router  from '@angular/router';

@Injectable(
  providedIn: 'root'
)
export class HttpdaService 
  serverUrl = 'http://127.0.0.1/';

  constructor(private http: HttpClient, private _router: Router)  

  getKbs(): Observable<any> 
    return this.http.get<any>(this.serverUrl);
  

  checkErr(err) 
    if (err instanceof HttpErrorResponse) 
        console.log(err.status);
    


  private extractData(res: Response) 
    let body = res.json();
    return body;
  

型号:

export class Kbs 
    'message': string;

当我使用 cURL 调用我的 API 时会收到什么 -

curl 127.0.0.1 

   "message": "welcome" 

这是我在控制台中得到的 -

【问题讨论】:

首先发布错误... 另外,实际上应该由 service 来应用 checkErr,因此您不必在每个消费者中一次又一次地这样做。 @Carsten,当然,但是有错误。它只是在控制台中显示未定义。我现在就贴出来。 console.log(this.kbs); 放入.subscribe()this.kbs=kbs 之后可观察到 【参考方案1】:

您的服务中的函数是一个异步方法,它返回的值不像您预期​​的那样同步。问题出在你给出日志的地方。 console.log(this.kbs) 命令在调用 this.getKbs() 调用后立即执行,而不是在返回值之后执行。这就是为什么您在尝试记录它时可能会得到 undefined 的值。 如果您只是记录日志,请尝试将日志放入函数中。或者只是尝试,

console.log(this.getKbs());

而不是

console.log(this.kbs);

【讨论】:

【参考方案2】:

您在 getKbs 函数中有一个异步调用。 如果您想控制数据,您应该将控制台日志移动到订阅中,如下所示:

    import  Component, OnInit  from '@angular/core';
    import  Observable  from 'rxjs';
    import  HttpdaService  from '../httpda.service';
    import  Kbs  from '../kbs';

    @Component(
      selector: 'app-home',
      templateUrl: './home.component.html',
      styleUrls: ['./home.component.css']
    )
    export class HomeComponent implements OnInit 
      observableKbs: Observable<any[]>;
      kbs: Kbs[];

      constructor(private http: HttpdaService)  

      ngOnInit() 
        this.getKbs();
      

      getKbs() 
        this.observableKbs = this.http.getKbs();
        this.observableKbs.subscribe(
          kbs => 
             this.kbs = kbs,
             console.log(this.kbs);
          
          err => this.http.checkErr(err)
        );
      
    

在您的代码中,您在 getKbs 函数中返回了 undefined。现在您可以使用 this.kbs 而不是调用 getKbs 函数。

【讨论】:

【参考方案3】:

您不会在获取数据的范围之外订阅 kbs。如果您在项目的任何地方都需要异步数据,则必须再次订阅。

另外,如果您在模板中使用异步数据,请使用异步管道。

【讨论】:

【参考方案4】:

很明显你做错了什么。

kbs 未定义。在初始化时,您控制台记录 kbs。而已。您的数据稍后会设置。阅读异步函数。

在实际设置数据时尝试记录:

this.observableKbs.subscribe(
      kbs => this.kbs = kbs; console.log(kbs),
      err => this.http.checkErr(err)
    );

【讨论】:

以上是关于无论我做啥,变量都是未定义的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

PHPStorm:由include/require引起的未定义变量

Angular 2 System 是未定义的错误

为啥没有用户ID?它是未定义的

React FixedDataTable 单元格总是得到一切都是未定义的

两者都实现了 JavaLaunchHelper 类。将使用两者之一。哪一个是未定义的[重复]

Symfony 2,未定义的变量,在构造函数中初始化为 ArrayCollection 的受保护成员通过错误,它是未定义的