Использование http-клиента для получения значения с сервера и его использования для следующих шагов

У меня есть функция, как показано ниже, где мне нужно позвонить на сервер и получить значение, которое возвращает функция. Я использую подписку rxjs. Я получаю значение, но поскольку rxjs является асинхронным, функция возвращается до того, как значение будет получено с сервера. Ниже приведен псевдокод, объясняющий, что я пытаюсь сделать:

..

let myValue = getValue();
private getValue(): string {
	let val = '';
    this.httpClient.get('/server url', { observe: "response" }).subscribe(res => {
                val = res.headers.get('X-Some-Header-Name');
            });}
    return val;
}
..

Я знаю, что подписка возвращается сразу и, следовательно, функция getValue не возвращает значение с сервера. Есть ли способ заставить функцию возвращать значение только при наблюдаемом возврате?


person F. K.    schedule 05.04.2020    source источник
comment
Нет, см. stackoverflow.com/questions/38291783/   -  person martin    schedule 05.04.2020
comment
Вы не можете вернуть синхронные данные из асинхронного запроса. Вы можете либо присвоить значение переменной внутри подписки, либо, если вам нужно использовать переменную в шаблоне, используйте наблюдаемую непосредственно в шаблоне с каналом async.   -  person Michael D    schedule 06.04.2020


Ответы (2)


если вам нужно дождаться ответа, вам нужно вернуть наблюдаемое и подписаться на него в том месте, где вам нужно значение.

let myValue = getValue();
private getValue(): Observable<string> {
    return this.httpClient.get('/server url', { observe: "response" }).pipe(
        map(res => res.headers.get('X-Some-Header-Name')),
    );
}
person satanTime    schedule 05.04.2020

Как @satanTime уже указал в своем ответе, вам следует работать с Observable, который возвращает HttpClient.

Затем вы также можете работать с myValue в своем шаблоне, используя канал async, например:

<p>{{myValue | async}}</p>

Ссылка: https://angular.io/guide/observables-in-angular

person Enzo Volkmann    schedule 05.04.2020