HTTP-служба Angular 2 не возвращает обещание

#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() || {})