Использование служб REST в Angular 6 с использованием HttpClient дает наблюдаемое значение как неопределенное при подписке

Я создал службу Angular, которая возвращает массив объектов Observable, используя of от rxjs:

export class HackfestService {

  constructor(private http: HttpClient) { }

  getHackfests():Observable<HackFestDetails[]>{
    return of([
      {hackfestId: 1, hackfestName: "Hackfest Alpha",hackfestDate: new Date('June 12, 2018'), noOfParticipants: 500, noClearedPre: 100, isFinalResultOut:true, isPreResultOut:true},
      {hackfestId: 2, hackfestName: "Hackfest Beta",hackfestDate: new Date('July 22, 2018'), noOfParticipants: 0, noClearedPre:0 , isFinalResultOut:false, isPreResultOut:false}
    ]);
  }
}

Работает нормально пока не заменю of расстаться с фактическим HttpClient.get() запрос, как это:

export class HackfestService {

  private hackfestsURL =  'http://localhost:57161/api/Hackfest/GetHackfests';
  constructor(private http: HttpClient) { }

  getHackfests():Observable<HackFestDetails[]>{
    // return of([
    //   {hackfestId: 1, hackfestName: "Hackfest Alpha",hackfestDate: new Date('June 12, 2018'), noOfParticipants: 500, noClearedPre: 100, isFinalResultOut:true, isPreResultOut:true},
    //   {hackfestId: 2, hackfestName: "Hackfest Beta",hackfestDate: new Date('July 22, 2018'), noOfParticipants: 0, noClearedPre:0 , isFinalResultOut:false, isPreResultOut:false}
    // ]);
    return this.http.get<HackFestDetails[]>(this.hackfestsURL);
  }
}

Я проверил URL, который дает результат JSON как:

    [{"hackfestId":1,"hackfestName":"Hackfest Alpha","hackfestDate":"2018-06-12T00:00:00","noOfParticipants":100,"noClearedPre":100,"isFinalResultOut":true,"isPreResultOut":true},
    {"hackfestId":2,"hackfestName":"Hackfest Beta","hackfestDate":"2018-07-22T00:00:00","noOfParticipants":0,"noClearedPre":0,"isFinalResultOut":false,"isPreResultOut":false}]

Я подписался на наблюдаемый в моем компоненте как:

ngOnInit(){
    this.getHackfestList();
    this.selectedHackfest = this.allHackfests[0];
  }

  getHackfestList():void{
    //call api and get the list sorted in descending order of festival date
    this.hackfestService.getHackfests().subscribe(items => {
      this.allHackfests = items;
      console.log(this.allHackfests);
    });

    this.allHackfests.sort((x:HackFestDetails, y:HackFestDetails)=>{return y.hackfestDate.getTime()-x.hackfestDate.getTime()} );
  }

console.log() внутри метода подписки фактически записывает полученные данные JSON из HttpClient.get() метод, но атрибут this.allHackfests остатки undefined и, следовательно, выдает ошибки, когда я пытаюсь получить доступ к любому из его атрибутов.

Официальный учебник для Angular 6 имеет аналогичную реализацию, для которой они заявляют:

Вы заменили http.get, и приложение продолжает работать без каких-либо других изменений, потому что обе функции возвращают Observable

Очевидно, что утверждение не соответствует тому, что я наблюдаю в моей реализации. Есть ли еще какие-то изменения, которые я мог бы пропустить?

1 ответ

Это потому что getHackfests() это асинхронная функция

Код не будет ждать и выполнит следующие строки, отсюда и ошибка.

Вы должны переместить sort часть внутри subscribe,

Другие вопросы по тегам