我正在尝试获取角度2服务以从HTTP请求中检索数据并将其作为承诺返回。当我在组件中使用该服务时,我从服务传递的数据将返回为undefined。
这是我的服务
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class RecordService {
constructor(private http: Http) {}
getPosts(): Promise<any> {
return this.http
.get('https://jsonplaceholder.typicode.com/posts')
.toPromise()
.then((response: Response) => response.json().data)
.catch(this.handleError);
}
private handleError(error: any): Promise<any> {
console.error('An error occurred', error);
console.log('ERROR');
return Promise.reject(error.message || error);
}
}
这是我的组件
import { Component, OnInit } from '@angular/core';
import { RecordService } from './record.service';
import { Router } from '@angular/router';
@Component({
selector: 'record-view',
template: '<h1>This is the record creation page</h1>',
providers: [RecordService]
})
export class RecordComponent implements OnInit{
message: string;
error: any;
constructor(private recordService: RecordService) {
}
ngOnInit() {
this.recordService.getPosts()
.then(data => console.log(data))
.catch(error => console.log(error));
}
}
为什么数据未定义的任何想法?
答案 0 :(得分:5)
response.json()已经将您的响应的数据对象作为JSON返回,因此删除.data属性访问。
答案 1 :(得分:1)
当您response.json()
时,结果是您所做请求的回复中的确切内容。
在这种情况下,https://jsonplaceholder.typicode.com/posts
会返回一个数组(如果在浏览器中打开您将看到该数组的网址):[{...}, {...}, ...]
。
答案 2 :(得分:1)
从response.json().data
移除.data
,如果正文为空则添加|| {}
最后:
.then((response: Response) => response.json() || {})