как мне вернуть значение только в окончательном блоке переопределения входа в firebase - PullRequest
0 голосов
/ 05 августа 2020
 tryToLogin(email:string,password:string) {
  var success:boolean
  this.auth.signInWithEmailAndPassword(email, password)
  .then((firebaseUser)=>{
    // on success
    success = true
  })
  .catch(function(error) {
    //on fail
    var errorCode = error.code;
    var errorMessage = error.message;
    success = false
  }).finally(()=>{
    return success
  })
}

этот не работает. он возвращает undefined.

любые идеи (возможно, каким-то образом с помощью asyn c, await и promises)

1 Ответ

0 голосов
/ 05 августа 2020

Я не совсем уверен, что вы этого хотите. Но вы можете преобразовать обещание в наблюдаемое с помощью Rx JS map и применить такие операторы, как map и catchError, чтобы вернуть требуемую переменную success.

import { from, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';

tryToLogin(email: string, password: string): Observable<any> {
  return from(this.auth.signInWithEmailAndPassword(email, password)).pipe(
    map(firebaseUser => {
      // on success
      return true;
    }),
    catchError(error => {
      // on error
      return of(false);      // <-- you need to return an observable from `catchError` - so use `of`
    })
  );
}

Теперь, поскольку вы возвращаете наблюдаемое вместо обещания, вы можете подписаться на функцию, в которой он используется.

this.someService.tryToLogin(...).subscribe(
  res => console.log(res),   // <-- will print `true` on successful login and `false` on failed login
  error => { }
);

Если вы используете sh, чтобы получить уведомление error вместо уведомления next, вам нужно выбросить ошибку из блока catchError. Вы можете использовать функцию Rx JS throwError.

import { throwError, from } from 'rxjs';
import { map, catchError } from 'rxjs/operators';

tryToLogin(email: string, password: string): Observable<any> {
  return from(this.auth.signInWithEmailAndPassword(email, password)).pipe(
    map(firebaseUser => {
      // on success
      return true;
    }),
    catchError(error => {
      // on error
      return throwError(false);      // <-- use `throwError` to emit an `error` notification
    })
  );
}

Теперь ошибки будут обнаружены в обратном вызове error

this.someService.tryToLogin(...).subscribe(
  res => console.log(res),           // <-- will print `true` on successful login
  error => console.log(error)        // <-- will print `false` on failed login
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...