Angular не может выдвинуть HTTP-ответ в свойстве массива - PullRequest
0 голосов
/ 31 декабря 2018

Я получаю значение json из API, используя httpclient, который содержит идентификатор в угловом 6, и я передаю этот идентификатор в другой URL-адрес, чтобы получить результат для каждого идентификатора, который будет выполняться id.length раз.Я объявил свойство массива и пытаюсь вставить второй результат http в массив.Когда я выхожу из результатов, я вижу, что результаты не вставляются в квадратный beacket;значения json находятся за пределами квадратной скобки.Пожалуйста, найдите ниже изображение для результата.Может кто-нибудь, пожалуйста, дайте мне решение, как правильно толкнуть значение в свойстве массива.

Служба Angular:

    import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { Stories } from '../stories';
import { error } from 'util';
import { tap, map, catchError } from 'rxjs/operators';




@Injectable({
  providedIn: 'root'
})
export class HackerStoriesService {

  Story: Array<any> = [];
  ChildStory: Array<object> = []; 

  constructor(private http: HttpClient) { 

  }

  getStories(){
    this.http.get<Stories[]>('URL')
    .subscribe((response) => {
      this.Story = response;

      for(let i=0;i<=this.Story.length;i++){
           this.http.get('URL'+this.Story[i]+'.json')
           .subscribe((response)=> {
             this.ChildStory.push(response)
           })  

      }
      console.log(this.ChildStory)

     return this.ChildStory; 
    },
   (error) => {console.log("Error occurred" + error)},
 ()=> {console.log("The subscription is completed")});



 }


}

Результат:

Когда я регистрирую результат console.log (this.ChildStory), я получаю следующий результат.) https://i.stack.imgur.com/1korE.jpg [1]

1 Ответ

0 голосов
/ 01 января 2019

В тот момент, когда вы вызываете свой console.log, переменная имеет значение null, но когда вы смотрите на нее на более позднем этапе в консоли, эта переменная заполняется, поэтому вы можете видеть значения там.(Как указано здесь )

В функции getStory () вы можете вернуть Observable.Это может выглядеть примерно так:

getStories() {
    return new Observable<Stories[]> ( (observer) => {
        this.http.get<Stories[]>('URL').subscribe((response) => {

            this.Story = response;
            let storiesCalls = [];
            for (let i = 0; i < this.Story.length; i++) {
                storiesCalls.push(this.http.get('URL' + this.Story[i]+'.json'));
            }

            forkJoin(storiesCalls).subscribe((childStories) => {
                observer.next(childStories);
                observer.complete();
            });

        }, (error) => {
            console.log("Error occurred" + error)
            observer.error(error);
            observer.complete();
        });
    });
}

Тогда вы можете подписаться на возвращаемое значение Observable, где бы вы ни хотели использовать полученные значения:

hackerStoriesServiceInstance.getStories().subscribe((childStories) => {
    //do stuff with childStories object
}

У меня не было времени запустить код, поэтому могут быть некоторые «ошибки», если вы обнаружите какую-либо проблему, сообщите мне и обновите ответ.

...