У меня есть представление входа в систему в Angular. Я сделал:

  1. UserService для получения данных пользователя.

  2. AuthService для проверки действительного пользователя.

Итак, из режима входа я передаю имя пользователя AuthService , и он связывается с UserService для получения данных, обрабатывает данные и возвращает значение boolean, является ли пользователь действительным. или нет.

Код, приведенный ниже, из режима входа в систему выглядит следующим образом:

AuthenticationService:

this.authenticationService.checkValidLogin(userName,password);

AuthenticationService:

checkValidLogin(username: string, password: string) {
    this.userService.getUserByEmail(username).snapshotChanges().pipe(map(data => data.map(c => ({ key: c.payload.doc.id, ...c.payload.doc.data() })))).subscribe(res => {
        if (res[0].password === password) {
            return true;
        } else {
            return false;
        }
    });
}

Я вернул true и false, но это не вернется к методу .. !!

Я хочу вернуть значение true или false из подписки или что мне здесь не хватает?

0
kushal Baldev 7 Окт 2020 в 18:14

2 ответа

Лучший ответ

Поскольку код является асинхронным, вы должны вернуть Observable и подписаться на него, если хотите проверить его действительность.

checkValidLogin(username: string, password: string): Observable<boolean> {
    return this.userService.getUserByEmail(username).snapshotChanges().pipe(map(data => data.map(c => ({ key: c.payload.doc.id, ...c.payload.doc.data() }))),
// map result to true or false
map(res => {
      if (res[0].password === password) {
        return true;
      } else {
        return false;
      }
    })
);

Тогда, когда вы хотите использовать это:

this.authenticationService.checkValidLogin(userName,password).subscribe(valid => {
  console.log(valid); // do your logic here of everything that determines if it's valid or not
});
1
AliF50 7 Окт 2020 в 15:20

Пожалуйста, добавьте возврат до this.userService.getUserByEmail, как показано ниже.

checkValidLogin(username: string, password: string){
return this.userService.getUserByEmail(username).snapshotChanges().pipe(map(data => data.map(c => ({ key: c.payload.doc.id, ...c.payload.doc.data() })))).subscribe(res => {
  if (res[0].password === password) {
    return true;
  } else {
    return false;
  }
});

Я также предлагаю просто return res[0].password === password, поскольку он возвращает логическое значение

0
adhs91 7 Окт 2020 в 16:19