[解決済み】take(1) vs first()
2022-04-23 01:49:48
質問
の実装をいくつか見つけました。
AuthGuard
を使用しています。
take(1)
. 私のプロジェクトでは
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)
}
}
解決方法は?
演算子
first()
と
take(1)
は同じではありません。
は
first()
演算子は、オプションの
predicate
関数を実行し
error
通知で、ソースが完了したときに一致する値がない場合。
例えば、これはエラーを出します。
import { EMPTY, range } from 'rxjs';
import { first, take } from 'rxjs/operators';
EMPTY.pipe(
first(),
).subscribe(console.log, err => console.log('Error', err));
... また、これと同じように
range(1, 5).pipe(
first(val => val > 6),
).subscribe(console.log, err => console.log('Error', err));
これが最初に発せられた値にマッチするのに対して
range(1, 5).pipe(
first(),
).subscribe(console.log, err => console.log('Error', err));
一方
take(1)
は、単に最初の値を受け取って完了します。それ以上のロジックはありません。
range(1, 5).pipe(
take(1),
).subscribe(console.log, err => console.log('Error', err));
そうすると、ソースが空のObservableでは、エラーは出ません。
EMPTY.pipe(
take(1),
).subscribe(console.log, err => console.log('Error', err));
2019年1月:RxJS 6に対応した更新を行いました。
関連
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] Angularで変更検知を手動でトリガーする
-
[解決済み] Angular HTTP GET with TypeScript エラー http.get(...).map is not a function in [null].
-
[解決済み】コンポーネントのプロパティが現在の日付時間に依存している場合、Angular2の「expression has changed after it was checked」例外を管理する方法
-
[解決済み] Angular2の括弧、括弧、アスタリスクの違いは何ですか?
-
[解決済み] angular2 tslintの警告を止めるためにコンポーネントのデフォルトプレフィックスを変更する方法
-
[解決済み] Angular 2 http.post()がリクエストを送信しない
-
[解決済み] Angular 2の無効化されたコントロールがform.valueに含まれない
-
[解決済み] Angular 2+ - ベースのhrefを動的に設定する
-
[解決済み] ページを離れる前に、未保存の変更点を警告する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Angularインタビュー質問まとめ1~基礎知識(Angular v8+)編
-
[解決済み] Angular/RxJS `Subscription` からいつ退会すればいいのか?
-
[解決済み] ExpressionChangedAfterItHasBeenCheckedErrorの説明
-
[解決済み] Angularで変更検知を手動でトリガーする
-
[解決済み] Angularアプリを本番用にバンドルする方法
-
[解決済み] ngIf」は「div」の既知のプロパティではないため、バインドできない [重複] 。
-
[解決済み】エラー NG6002: AppModule の NgModule.imports に表示されるが、NgModule クラスに解決できなかった。
-
[解決済み] テンプレート駆動型とリアクティブ型の実用的な違いとは?
-
[解決済み] Angularアプリケーションが本番モードと開発モードのどちらで動作しているかを確認する方法
-
[解決済み] AngularのHttpClientでエラーをキャッチする