Невозможно присвоить наблюдаемые данные локальной переменной в angular - PullRequest
0 голосов
/ 16 февраля 2020

Мой сервис

import { Injectable } from '@angular/core';
import {Observable} from 'rxjs';
import { HttpClient,HttpParams } from '@angular/common/http';

@Injectable()
export class UserService {

  constructor(private http: HttpClient) { }
  isAdmin;
  getLogIn(email:string,password:string):Observable<boolean>{
    let params = new HttpParams().set("userEmail",email).set("userPassword", password);
    return this.http.get<boolean>("http://localhost:8080/user/login",{params: params});
     }
}

Мой вызов по подписке

 email:string="";
  password:string="";
  adminFlag:boolean=false;

  login(event: any) {
    console.log(this.adminFlag);
    this.userService.getLogIn(this.email,this.password).subscribe(data => this.adminFlag=(data));
    console.log(this.adminFlag);
    if(this.adminFlag){
      console.log("INSIDE IF")
        this.router.navigate("../../home");
    }
  }

Когда я вхожу в консоль var данных, я получаю необработанный данные как

true

, но я не могу назначить их этому логическому «adminFlag», оно изменено на неопределенное

Все, что я пропустил ... ???

API возвращает логическое значение. Мне нужно назначить логическое значение ...

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

HTTP GET - это асинхронный запрос . Это означает, что вы читаете переменную adminFlag перед ее установкой. Переместите маршрутизацию внутри обратного вызова, чтобы установить значение и использовать его. Также всегда полезно включать обратный вызов ошибок в HTTP-запросы. Это должно работать:

login(event: any) {
  this.userService.getLogIn(this.email,this.password).subscribe(
    data => {
      this.adminFlag = data; 
      if (data) {
        this.router.navigate("../../home");
      }
    },
    error => {
      console.error('getLogIn failed');
      // handle error...
    }
  );
}
0 голосов
/ 16 февраля 2020

Когда вы выполняете:

    this.userService.getLogIn(this.email,this.password).subscribe(data => this.adminFlag=(data));

, это означает, что вы ожидаете, что DATA будет логическим. Вместо этого это наблюдаемое логическое значение. Чтобы получить реальное логическое значение, используйте функцию pipe, например:

getLogIn(email:string,password:string):boolean{
  let params = new HttpParams().set("userEmail",email).set("userPassword", password);
  return this.http
    .get<boolean>("http://localhost:8080/user/login",{params: params})
    .pipe(map(data => data);
}
...