【问题标题】:Angular 4 http not returning responseAngular 4 http不返回响应
【发布时间】:2017-08-30 18:31:49
【问题描述】:

我创建了一个简单的服务来通过 http 请求获取数据。数据为 json 格式,我使用 map 函数使其与 Blog 数据类型相匹配。但是,当我从服务中调用方法“getBlogs”来获取数据时,没有返回任何内容。对我缺少的东西有什么想法吗?

组件。

import {Http} from '@angular/http';
import {forEach} from '@angular/router/src/utils/collection';
import {BlogService} from '../services/blog.service';
import {Component, OnInit} from '@angular/core';
import {Blog} from '../blog/blog';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';

@Component({selector: 'app-blog-list', templateUrl: './blog-list.component.html',
styleUrls: ['./blog-list.component.css'],
providers: [BlogService]})
export class BlogListComponent implements OnInit {

  blogArray: Blog[] = [];
  blogTitle: string;
  loading: boolean;
  private blogsUrl = 'http://www.mocky.io/v2/59a49eb3100000be05b2aba6';

  constructor(private blogService: BlogService, private http: Http) {}

  ngOnInit() {
    this.blogService
      .getBlogs(this.blogsUrl)
      .subscribe(res => {
        this.blogArray = res;
        console.log('theBlogArray', this.blogArray);
      });
  }

}

服务

import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';
import {Headers, Http } from '@angular/http';
import { Injectable } from '@angular/core';
import {Blog} from '../blog/blog';

@Injectable()
export class BlogService {


  private loading: boolean;
  constructor(private http: Http) {}


  getBlogs(url: string): Observable<Blog[]> {
    this.loading = true;
    return this.http.get(url)
      .map((response) => response.json());
  }

}

如答案中所述,这可能是 CORS 问题。但是,我在控制台中根本没有收到任何错误。以防万一我在我的浏览器上启用了 CORS chrome 扩展(它称为 Allow-Control-Allow-Origin: *),这是我遇到 CORS 问题时通常会做的事情,我确保将它放在 mocky 的标题中,再次按照建议。什么都没有,控制台没有抱怨,webpack 编译成功。

如果我将 json 请求的值硬编码到服务中的一个数组中并通过组件访问它,则返回这些值,我可以控制台记录它们并将它们显示在 html 上。

【问题讨论】:

    标签: javascript angular http typescript angular2-observables


    【解决方案1】:
    ngOnInit() {
        this.blogService.getBlogs(this.blogsUrl)
          .subscribe(res => {this.blogArray = res;
    console.log('theBlogArray: ', this.blogArray);// this will work and use it in template like{{blogArray}}
    );
    
    
      }
    

    您正在获取数据,唯一的事情是您正在控制台将其记录在外部,因为它是异步调用,您无法登录同步上下文。

    更新

    我使用 Angular 尝试了相同的 url,它给出了一些 CORS 问题,后端有问题,请检查控制台。你会得到错误

    【讨论】:

    • 执行此操作时,我什至没有在控制台上显示打印语句。
    • @FernandoAnia console.log(this.blogArray) 试试这个
    • 没有影响
    • @FernandoAnia 控制台出现任何错误。我猜你没有从服务中获取数据
    • 完全没有错误。您可以点击链接查看回复mocky.io/v2/59a49eb3100000be05b2aba6。我还检查了邮递员的响应,它正在返回数据。
    【解决方案2】:

    订阅外的console print不会等待响应。所以试试吧

    ngOnInit() {
        this.blogService.getBlogs(this.blogsUrl)
            .subscribe(res => {
               this.blogArray = res;
               console.log('theBlogArray: ', this.blogArray);
        }, Err => console.log(Err));
    }
    

    .

    // Service   
    import 'rxjs/add/operator/catch';
    
    return this.http.get(url)
      .map((response) => response.json())
      .catch(Err);
    

    【讨论】:

    • 和我对其他人说的一样,当我尝试从 subscribe 函数中调用 console.log 时,chrome 控制台中没有任何显示
    • 我无法访问 fetch 方法,因为我正在使用来自 @angular/http 的 http 类
    • @Fernando Ania 您的问题解决了吗?还需要帮助吗?
    【解决方案3】:

    我没有看到来自 http 请求的响应的原因是因为我在主应用程序组件中引用了 blog-list 组件,而没有在主应用程序组件中导入 blog-list。

    我正在这样做

    <app-nav-bar></app-nav-bar>
    <app-blog-list></app-blog-list>
    

    这需要我这样做

    import { Component } from '@angular/core';
    import { BlogListComponent } from './blog-list/blog-list.component';
    
        @Component({
          selector: 'app-root',
          templateUrl: './app.component.html',
          styleUrls: ['./app.component.css']
        })
        export class AppComponent {
          title = 'app';
        }
    

    我仍然不确定为什么我能够在不将 blog-list.component 导入主应用程序的情况下从服务而不是从 http 请求访问硬编码数组的值。

    博客服务

    public blogExample: Blog;
      private loading: boolean;
    
      constructor(private http: Http) {
        this.blogExample = {
          id: 1,
          title: 'title',
          content: 'content'
        };
      }
    

    blog-list.component

    ngOnInit() {
        this.blogService
          .getBlogs(this.blogsUrl)
          .subscribe(res => {
            this.blogArray = res;
            console.log('theBlogArray', this.blogArray);
          });
    
        console.log('blogExample', this.blogService.blogExample);
    
      }
    

    【讨论】:

      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多