Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 服务`http`get方法不返回成功或错误_Angular_Typescript_Angular2 Services - Fatal编程技术网

Angular 服务`http`get方法不返回成功或错误

Angular 服务`http`get方法不返回成功或错误,angular,typescript,angular2-services,Angular,Typescript,Angular2 Services,我正在编写一个返回一系列汽车的服务。我的服务方法不返回成功或错误。文件夹资产与'app folder'位于同一目录中 这是我的服务方式: import {Injectable} from '@angular/core'; import {Http, Response} from '@angular/http'; import {Car} from '../../../domain/car'; import 'rxjs/add/operator/toPromise'; @Injectable()

我正在编写一个返回一系列汽车的服务。我的服务方法不返回成功或错误。文件夹资产与'app folder'位于同一目录中

这是我的服务方式:

import {Injectable} from '@angular/core';
import {Http, Response} from '@angular/http';
import {Car} from '../../../domain/car';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class CarService {

  constructor(private http: Http) {
  }
    getCarsMedium(): Promise<Car[]> {
       console.log("call1");
       return this.http.get('assets/data/cars-medium.json')
       .toPromise()
       .then(res => {
          console.log("sucess1" + res);
          console.log("sucess2" + res.json());
          return res.json().data as Car[]
          })
       .catch(error => {
          console.log("error");
          console.error(error);
       });
   }
这就是我的json的样子:

{"data":[
    {"vin":"a1653d4d","year":1998, "brand":"VW","color":"White"},
    {"vin":"a1653d4w","year":1999, "brand":"VV","color":"White"}
]}
实体类:

export interface Car {
  vin?;
  year?;
  brand?;
  color?;
}
编辑: getCarsMedium不返回成功或错误。 控制台输出: 电话2 电话1

显然,这不会打印任何内容,因为您打印的是第二个回调的响应,该回调传递给then,在承诺被拒绝的情况下执行,而承诺没有被拒绝

改为:

return this.http.get('assets/data/cars-medium.json') 
    .toPromise() 
    .then(res => {
        console.log(res);
        console.log(res.json());
        return res.json().data as Car[]
    }); 

我找到了原因:我在项目中有jwt认证
-它阻止了我的请求

我不知道它如何返回未定义的。它回报了一个承诺。可以解决或拒绝的问题。当你进入时会发生什么http://localhost:4200/assets/data/cars-浏览器位置栏中的medium.json,并在此处按enter键(假设您正在使用CLI),否则将端口更改为实际端口?返回my cars jsonOK,那么会发生什么?在代码中添加一些console.log,发布它,并告诉我们输出是什么。如果返回res.json而不是res.json.data会发生什么?我在这里添加了两个console.log:getCarsMedium:Promise{return this.http.get'assets/data/cars medium.json'.toPromise.thenres=>res.json.data as Car[],res=>console.logres;}这里:ngOnInit{this.carService.getCarsMedium.thencars=>this.cars=cars,cars=>console.logcars;}控制台没有显示任何更改,但仍然得到空控制台:这就是我建议添加几个console.logs的原因。例如,将一个放在对http的调用之前。我猜你只是从来没有打过电话。您的调试器也会有帮助。ngOnInit{console.logcall2;this.carService.getCarsMedium.thenfunction cars{cars=>this.cars=cars;console.logcars};}getCarsMedium:Promise{console.logcall1;返回这个.http.get'assets/data/cars medium.json'.toPromise.thenres=>{console.logres;console.logres.json;返回res.json.data作为Car[]};}控制台输出:call2 call1刚刚编辑问题。控制台中的输出是:call2 call1OK。现在在成功回调中添加一个console.log,并在还有console.log的地方添加一个错误回调。使它们都不同。
return this.http.get('assets/data/cars-medium.json') 
    .toPromise() 
    .then(res => res.json().data as Car[], 
          res => console.log(res)); 
return this.http.get('assets/data/cars-medium.json') 
    .toPromise() 
    .then(res => {
        console.log(res);
        console.log(res.json());
        return res.json().data as Car[]
    });