【问题标题】:HttpClientModule return empty ArrayHttpClientModule 返回空数组
【发布时间】:2019-04-17 18:42:13
【问题描述】:

我想使用 HttpClientModule 来访问 Post 的数组。 我只是在学习 Angular,所以任何人都可以向我解释为什么这是错误的

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';
import { HatedPostListComponent } from './hated-post-list/hated-post-list.component';
import { HatedAboutUsComponent } from './hated-about-us/hated-about-us.component';
import { HatedLoginComponent } from './hated-login/hated-login.component';
import { DataService } from './services/data.service';

@NgModule({
  declarations: [
    AppComponent,
    HatedPostListComponent,
    HatedAboutUsComponent,
    HatedLoginComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [DataService],
  bootstrap: [AppComponent]
})
export class AppModule { }

app.component.ts

import { Component } from '@angular/core';
import { DataService } from './services/data.service';
import { Post } from './models/user.model';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Frontend';
  constructor (private _svc: DataService) {
    console.log('Data in component' + this._svc.data);
  }
  getDate(): Array<Post> {
    return this._svc.data;
  }
}

data.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Post } from '../models/user.model';

@Injectable()
export class DataService {
  baseURL: string;
  data: Array<Post> = [];
  constructor(private _http: HttpClient) {
    this.baseURL = 'http://localhost:5000/Posts?from=0&number=10';

  }
  getDate() {
    this._http.get<Array<Post>>(this.baseURL)
    .subscribe(response => {
      this.data = response;
      console.log('Subcribed data:' + this.data);
      console.log('Subcribed response:' + response);
    }
  );
  console.log('Data after subcribe:' + this.data);
  }
}

这就是我的 result 当我订阅()时一切正常,但之后我的数据为空

【问题讨论】:

  • 只需将data: Array&lt;Post&gt; = [];.subscribe(response =&gt; { //... 移动到组件而不是服务。不订阅服务,订阅组件。
  • http 请求是异步发生的。您的控制台日志 (console.log('Data after subcribe:' + this.data);) 发生在异步代码之外,这就是为什么您看到在其他日志之前记录到控制台的原因

标签: javascript angular


【解决方案1】:

将您的实现更改为遵循您将获得预期结果。

你的组件:

getDate(){
  this._svc.getDate().subscribe((res)=> {
    console.log(res)
  });
}

您的服务:

getDate() {
  return this._http.get(this.baseURL);
}

这应该可行。您的逻辑问题是您只是在听服务中数据的当前值。如果该时间点服务持有 [],则在从 API 接收数据后,您的组件不会收到更改通知,除非您订阅它。

【讨论】:

    【解决方案2】:

    您需要调用服务并订阅您的组件而不是服务。

    将您的服务代码更改为,

    getDate() {
       return this._http.get<Array<Post>>(this.baseURL);
    }
    

    在你的组件中,

     getDate(): Array<Post> {
        this._svc.getDate().subscribe(
          res => {
            console.log(res);       
          },
          err => console.log(err)
        );
      }
    

    【讨论】:

    • 这样做的目的是什么? .pipe(map(res =&gt; res))这似乎不需要。
    • 可能是因为您最初的回答只是“您需要调用服务并订阅您的组件而不是服务。”
    • 哈哈,我明白了,但每个人都需要一些时间来更新完整的答案:)
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 2021-08-11
    • 2017-02-27
    • 2020-04-01
    • 2017-04-24
    • 2019-09-13
    • 2018-02-03
    • 2019-07-05
    相关资源
    最近更新 更多