Получите объект результата как неопределенный при получении данных из веб-API. только в первом звонке - PullRequest
1 голос
/ 21 мая 2019

Попытка получить массив данных из веб-API.Когда я в первый раз вызываю api, результат возврата указывает на неопределенность.Любой звонок после этого получает ожидаемый результат.

Сохранение результатов метода вызова на станции

@Injectable()
export class StationService {

    private stations;
    constructor(private webservice: WebService) { }

    Oncall() {
        this.webservice.GetData('Search/GetStations').subscribe((respons: Station[]) => { this.stations = respons; });
        console.log(this.stations);
        console.log('----------------------------------');
    }
}
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Station } from '../dataModels/stationModel';
import { map } from 'rxjs/operators';

@Injectable()
export class WebService {
    private url = 'http://localhost:11835/Api/';

    constructor(private http: HttpClient) { }

    GetData(path: string) {
        return this.http.get<Station[]>((this.url + path)).pipe(
            map((data: Station[]) => data)
        );
    }
}

Спасибо

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Изменение в вашем коде:

    Oncall() {
        this.webservice.GetData('Search/GetStations').subscribe((respons: Station[]) => { 
         this.stations = respons;
         console.log(this.stations);
         console.log('----------------------------------');
        });

    }

Проблема в том, что при первом вызове сервисной функции (GetData) для получения данных требуется некоторое время, и вы запускаете console.log (this.станций);после.Эта часть вашего кода выполняется асинхронно и не ожидает выполнения назначения this.stations = resp;

При следующем вызове он отображает предыдущие значения

0 голосов
/ 21 мая 2019

Ваш код console.log происходит синхронно, так как он находится вне области действия вашей подписки, поэтому он возвращает неопределенное значение. Однако сразу после этого асинхронный код разрешает и устанавливает «this.stations» в ответ. Таким образом, вы всегда просматриваете результат на один веб-запрос.

Изменения, предложенные Леонардо, приведут к появлению журнала после разрешения http-запроса

0 голосов
/ 21 мая 2019

Ваш консольный журнал находится вне области назначения.Прежде чем данные получат возможность вернуться, вы пытаетесь зарегистрировать объект, который вы видите, если он не определен.Когда вы нажмете его во второй раз, данные будут получены из первого вызова, поэтому они регистрируются, но вы, вероятно, заметите, что данные устарели, если вы внесли в них какие-либо изменения.

Если вы хотите увидеть файл console.log после того, как вы изначально получили данные, добавьте журнал консоли, где данные назначаются объекту, вот так:

Oncall() {
        this.webservice.GetData('Search/GetStations').subscribe((respons: Station[]) => { 
         this.stations = respons;
         console.log(this.stations);
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...