Znalazłem kilka implementacji Auth Guards, które używają take(1)
. W moim projekcie użyłem first()
, aby zaspokoić moje potrzeby. Czy to działa tak samo? Albo jeden z nich może mieć zalety.Angular 2 przy użyciu RxJS - take (1) vs first()
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/first';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AngularFire } from 'angularfire2';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private angularFire: AngularFire, private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
return this.angularFire.auth.map(
(auth) => {
if (auth) {
this.router.navigate(['/dashboard']);
return false;
} else {
return true;
}
}
).first(); // Just change this to .take(1)
}
}
Podobnie jak uwaga, nie powiedziałem, że 'pierwszy()' i 'wziąć()' są takie same w ogóle, co moim zdaniem jest oczywiste, że tylko pierwszy '()' i 'take (1)' są takie same. Nie jestem pewien z twojej odpowiedzi, jeśli uważasz, że wciąż istnieje różnica? –
@ GünterZöchbauer Właściwie ich zachowanie jest inne. Jeśli źródło nie emituje niczego i kończy, wówczas 'first()' wysyła powiadomienie o błędzie, podczas gdy 'take (1)' po prostu nie wyśle niczego. – martin
Ok, teraz rozumiem.Wielkie dzięki :) –