#javascript #angular #typescript
#javascript #angular #typescript
Вопрос:
Я пытаюсь заставить службу angular 2 извлекать данные из HTTP-запроса и возвращать их как обещание. Когда я использую службу в компоненте, данные, которые я передаю из службы, возвращаются как неопределенные.
Это мой сервис
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));
}
}
Есть идеи, почему данные будут неопределенными?
Ответ №1:
response.json() уже возвращает вам объект данных вашего ответа в формате JSON, поэтому удалите доступ к свойству .data.
Комментарии:
1. Спасибо! Это было гораздо более простое решение, чем я ожидал!
Ответ №2:
Когда вы response.json()
получаете точное содержимое из ответа на сделанный вами запрос.
В этом случае https://jsonplaceholder.typicode.com/posts
возвращает массив (если открыть URL-адрес в браузере, вы увидите массив): [{...}, {...}, ...]
.
Комментарии:
1. JSON также может быть массивом.
Ответ №3:
Из response.json().data
удалить .data
и добавить || {}
, если тело равно нулю
Наконец:
.then((response: Response) => response.json() || {})