Typescript不会加载在函数外声明的数组。请建议

问题描述 投票:-1回答:1

发出http请求并解释响应。响应包含未在函数内加载的对象和数组。

Notes:- making http request.

public getRequest(): void {
    let bdoNamesArray: BdoName[];
    bdoNamesArray = [];

    this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'})
      .subscribe((data: HttpResponse<BdoName[]>) => {
            let vjyArray: BdoName[];
            vjyArray = [];
            for (let i = 0; i < data.body.length; i++) {
                  const obj = new BdoName();
                  obj.emplid = data.body[i].emplid;
                  obj.name = data.body[i].name;
                  vjyArray.push(obj); }
          console.log(vjyArray); // Array loaded from http-response
          bdoNamesArray.concat(vjyArray); // not loaded
          },
        error => {
          console.log('error on sub');
        },
        () => {
          console.log('sub completed');
        }
    );
    console.log(bdoNamesArray); // Emtpy array !!
}
typescript
1个回答
1
投票

当您在最后执行console.log时,该数组为空,因为该数组在执行时在技术上是空的。这是因为操作数组的代码将来某个时间运行,而不是在订阅GET请求之后直接运行。

例如;代码的执行是这样的:

  1. let bdoNamesArray: BdoName[]; bdoNamesArray = [];
  2. 触发GET数据this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'})的事件
  3. 您通过说明此事件何时返回我的数据来订阅此事件,请执行以下操作 let vjyArray: BdoName[]; vjyArray = []; for (let i = 0; i < data.body.length; i++) { const obj = new BdoName(); obj.emplid = data.body[i].emplid; obj.name = data.body[i].name; vjyArray.push(obj); } console.log(vjyArray); // ...
  4. 它继续并执行console.log(bdoNamesArray);,你注意到它是一个空数组。 将来的某个时候:您的bdoNamesArray由您在步骤3中输入的逻辑填充

所以你的代码是异步运行的,因此你需要将你的逻辑开发成你在异步调用的回调中所做的任何事情。

解决此问题的一种方法是返回observable本身并让调用者决定结果的逻辑。

示例(假设this.http.get()返回一个observable):

public getRequest(): Observable<any> {
    let bdoNamesArray: BdoName[];
    bdoNamesArray = [];

    let result = this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'});

    return result;
}

另一种方法是你有另一个回调函数:

public getRequest(): void {
    let bdoNamesArray: BdoName[];
    bdoNamesArray = [];

    this.http.get<BdoName[]>(this.bdoNamesUrl, {observe: 'response', responseType: 'json'})
      .subscribe((data: HttpResponse<BdoName[]>) => {
            doStuff(data);
          },
          //...
}
© www.soinside.com 2019 - 2024. All rights reserved.