Я нашел несколько реализаций Auth Guard, в которых используется take(1)
. В моем проекте я использовал first()
для удовлетворения моих потребностей. Это работает так же? Или один из них может иметь преимущества или около того.Угловой 2 с использованием 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)
}
}
Так же, как примечание, я не сказал, что 'первый()' и 'взять()' одни и те же в общем, я думаю, это очевидно, только что 'первая()' и 'take (1)' совпадают. Я не уверен в вашем ответе, если вы считаете, что все еще есть разница? –
@ GünterZöchbauer На самом деле, их поведение отличается. Если источник ничего не испускает и не завершает, тогда 'first()' посылает уведомление об ошибке, а 'take (1)' просто ничего не испустит. – martin
Хорошо, теперь я понимаю.Большое спасибо :) –