Назначьте значение, возвращаемое Observable.subscribe () для const - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь отправить запрос в мой Django API из интерфейса Ionic4-Angular, проблема в том, что я еще не ознакомился с этой технологией или даже javascript.В следующем коде я пытаюсь вернуть данные подписки и присвоить их const.

async getUserLogged() {
    const tkn = await this.authService.getToken();
    const user = await this.http
      .post('http://localhost:8000/api/getuser/', {
        token: tkn
      })
      .subscribe(response => {
        console.log(response);
        return response;
      });
    console.log(user);

    return user;
  }

Первый файл console.log содержит реальный объект, который я ищу.Тем не менее, второй печатает объект подписчика.Может кто-нибудь объяснить мне это поведение и как я могу это исправить

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Вот как я бы настроил этот метод:

getUserLogged() {
  return this.authService.getToken().pipe(
    switchMap(tkn=> {
      return this.http.post('http://localhost:8000/api/getuser/', {
        token: tkn
      })
   })
  );
}

Затем вы используете этот метод следующим образом:

getUserLogged().subscribe(userData => console.log(userData));

Этот подход использует switchMap Оператор, который вызывает http.post только один раз authService.getToken, возвращает токен. Вы можете найти документацию для всех операторов RxJs здесь .

0 голосов
/ 14 марта 2019

Преобразование вашего наблюдаемого ответа в обещание позволяет легко звонить туда, куда вам нужно.

const getUserLogged = () => {
    const tkn = await this.authService.getToken();
    return this.http
      .post('http://localhost:8000/api/getuser/', {
        token: tkn
      })
      .toPromise();
};

const someOtherFunc = async () => {
  const user = await getUserLogged();
  console.log({ user });
};
0 голосов
/ 14 марта 2019
Функция обратного вызова

из subscribe не может вернуть значение user. он получает только объект Subscriber, как вы упомянули, который является результатом наблюдаемого.

Если вы хотите использовать async, await подход, вам нужно использовать toPromise метод, чтобы сделать наблюдаемое обещание.

async getUserLogged() {
    const tkn = await this.authService.getToken();
    const user = await this.http
      .post('http://localhost:8000/api/getuser/', {
        token: tkn
      }).toPromise();
    console.log(user);

    return user;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...