0

Пытаюсь добиться такого поведения:

getAuth() {return false;}
currentAuth: Auth = {
    "auth": this.getAuth()
};

Но функция getAuth() должна вернуть результат обращения к простому АПИ:

{"auth":false}

Пытаюсь как то так:

getAuth() {   
  this.http.get('/server/api/userService').subscribe(data => {
   this.user = data;
   console.log(this.user.auth); // тут вижу нормальное значение, но на этом мои знания заканчиваются и не могу вернуть это значение из функции для использования ниже, в том же компоненте
  });
}



currentAuth: Auth = {
    "auth": this.getAuth()
};
Vadim
  • 313

1 Answers1

1

HttpClient

Будь внимателен, приведённый код писался в блокнотике на коленке - работоспособность не гарантирую. Но идею донести должен.

зачем нужен http.get

http.get нужен для того, чтобы ваш код работал и в вебе и "на мобилке" (native)
инфа без пруфа, как я её понимаю

http.get как и fetch асинхронен

поэтому давайте для понимания как он работает заменим его на fetch.
мы ведь все знаем как работает fetch

interface $auth {
    auth: any;
}
interface $user extends $auth {
    name: any;
}
class Q {
    user: $user;
    ngOnInit() {
        this.reqUserAuth()
    }
    async reqUserAuth() {
        const r = await fetch('/server/api/userAuth')
        if (!r.ok) {
            const e = new Error('!r.ok')
            console.error(e)
            return;
        }
        const data: $auth = await (r.json() as Promise<$auth>)

        if(!this.user)this.user = {} as any;
        Object.assign(this.user, data)
    }
}
<div>
{{user?.auth}}
<div>

0

Этот пример имеет смысл вынести в сервисы, но как и в предыдущем - не обязательно.

interface $user {
    auth: any;
}
class Q {
    user: $user;
    _user: Observable<$user> = this.http.get<$user>('/server/api/userService')
    ngOnInit() {
        this._user.subscribe((data: $user) => {
            this.user = data;
        });
    } 
}
qwabra
  • 4,962
  • 1
    http.get нужен для того, чтобы ваш код работал и в вебе и "на мобилке" (native) > не совсем. HttpClient под капотом использует XMLHttpRequest, который может отменять запросы. AbortController для отмены fetch запросов не поддерживается в IE/Safari, а так fetch имеет cross-support. Но мне не совсем понятно, зачем в ответ вовсе идет речь про fetch, у автора проблемы с пониманием асинхронности, а не с семантикой работы HttpClient. Да, и subscribe возвращает подписку, а не поток. – arturovt Feb 05 '20 at 12:49
  • "который может отменять запросы" - а полифилы в ангуляр проектах вы никода не испольуте? если используете - так давайте подумает почему бы нам не использовать полифил для fetch .... так что остаюсь при своём мнении, что это "для мобилок". – qwabra Feb 05 '20 at 13:31
  • зачем в ответе fetch если у автора проблемы с асинхонностью. если автор знает как работает fetch - он всё поймёт. ©мы ведь все знаем как работает fetch – qwabra Feb 05 '20 at 13:36
  • а тут вы наверное правы: "subscribe возвращает подписку, а не поток." - в лом устанавливать ангуляр и потроха(мой калькулятор виснет от него). отредактировал ответ, посмотрите пж, да и правки никто не запрещал... – qwabra Feb 05 '20 at 13:38
  • @overthesanity, а если дать свой ответ, так это ещё и поощряется! да-да, я вам говорю, вам автор спасибо скажет, точно-точно, правда сначала минусов накидают : ) – qwabra Feb 05 '20 at 13:42
  • так давайте подумает почему бы нам не использовать полифил для fetch > весь жизненный цикл HTTP запросов учитывая перехватчики, сериализация/десериализация завязаны на HttpClient, зачем тянуть какой-то полифил и увеличивать размер бандла, если все уже есть из коробки? В Антихрупкости есть хороший подход - доказывать должны те, кто предлагают что-то новое или нестандартное, а не те, кто следует заведенному или естественному порядку – arturovt Feb 05 '20 at 14:17
  • доказывать должны 1. уточню. ни в ответе, ни в этой переписке я не призываю использовать fetch 2. я лишь высказываю свои мысли 3. я пытаюсь разъяснить почему я так мыслю 4. и тут вы говорите мне что сделал не всё возможное и ещё остался должен.(без вашего желания я безсилен) 5. окончательное, повторюсь: если мы вдруг начнём использовать fetch или любую понравившуюся вам библиотеку - ангуляр не сломается! однако, до тек пор, пока вы не решите перенести проект на натив. – qwabra Feb 05 '20 at 14:32
  • Дело в том, что мы с ангуляром как мартышка и очки, я только делаю робкие попытки понять тайпскрипт. С выводом полученого результата от апи в шаблон проблем нет. А вот как по-простому достать значение от сервера и передать дальше не пойму. Где-то промелькнула мысль, что у меня проблемы с пониманием асинхронности, наверно это так. Может есть какой-то простой способ? Тупо присвоить переменной значение, полученное от сервера и использовать ее ниже по коду в том же компоненте? – Vadim Feb 06 '20 at 02:17
  • Оба примера у меня не сработали, скорее всего какая-то мелочь, но мелочи для меня самое сложное. В итоге пошел совершенно другим путем, добился цели. Ответ отметил как принятый, может пригодится тем, кто мало-мальски понимает ТС. – Vadim Feb 11 '20 at 07:05
  • 1
    1)в обоиx примерах почти чистый JS. 2) почитайте про фетч https://learn.javascript.ru/fetch. 3) по умолчанию в ангуляре любое присвоение this.variable = 'some new data' ведёт к перерисовке – qwabra Feb 11 '20 at 07:36
  • по умолчанию в ангуляре любое присвоение this.variable = 'some new data' ведёт к перерисовке - глупость =))

    – arturovt Feb 13 '20 at 09:41
  • Ведь правда? Но это ещё не самое странное, он перерисовывается на каждый и ивент! – qwabra Feb 13 '20 at 16:44