Observable
最初に呼び出されたときにすぐに破棄されるへのサブスクリプションを作成する必要があります。
次のようなものはありますか:
observable.subscribeOnce(func);
私の使用例では、エクスプレスルートハンドラーでサブスクリプションを作成し、サブスクリプションがリクエストごとに複数回呼び出されています。
Observable
最初に呼び出されたときにすぐに破棄されるへのサブスクリプションを作成する必要があります。
次のようなものはありますか:
observable.subscribeOnce(func);
私の使用例では、エクスプレスルートハンドラーでサブスクリプションを作成し、サブスクリプションがリクエストごとに複数回呼び出されています。
回答:
何が必要かについては100%確実ではありませんが、最初の値のみを監視したい場合は、first()
またはを使用しますtake(1)
。
observable.first().subscribe(func);
注:条件が満たされる.take(1)
と、.first()
両方とも自動的に登録解除されます
import { first } from 'rxjs/operators'
observable
.pipe(first())
.subscribe(func);
observable.pipe(first()).subscribe(func)
にどこfirst
から来るのかを望んでいますrxjs/operators
。
RxJSには、今まで出会った中で最高のドキュメントがいくつかあります。以下のリンクをたどると、非常に役立つテーブルマッピングからユースケースを演算子にマッピングできます。:例えば、「私は最初の値を取りたい」ユースケースの下に3つの演算子がありfirst
、firstOrDefault
とsample
。
オブザーバブルシーケンスが通知なしで完了した場合、first
オペレーターはサブスクライバーにエラーを通知し、firstOrDefault
オペレーターはサブスクライバーにデフォルト値を提供します。
Observableを1回だけ呼び出したい場合は、Observableからのストリームを待機しないことを意味します。したがって、サブスクリプションを解除する必要がないので、toPromise()
代わりにを使用するsubscribe()
だけで十分toPromise()
です。
await
promise
@Brandonの回答を補足first()
するには、にBehaviorSubject
基づいてを更新するためにを使用することなども不可欠ですObservable
。例(未テスト):
var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();
observable
.pipe(
first(), // <-- Ensures no stack overflow
flatMap(function(obj) {
obj[3] = 'pear';
return of(obj);
})
)
.subscribe(function(obj) {
subject.next(obj);
});
オブザーバブルをプロミスに変換するM FuatNUROĞLUの驚くべき答えを拡張して、非常に便利なバージョンを示します。
const value = await observable.toPromise();
console.log(value)
これの利点は、別のネストされたブロックを導入することなく、通常の変数のようにその値を使用できることです。
これは、複数のオブザーバブルから複数の値を取得する必要がある場合に特に便利です。清楚な。
const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();
if(isAuthenticated){
service.foo(content)
}
もちろん、async
このルートを使用する場合は、包含関数を作成する必要があります。.then
含まれている関数を非同期にしたくない場合は、promise のみを使用することもできます
このアプローチにトレードオフがあるかどうかはわかりませんが、コメントでお知らせください。
PSこの回答が気に入ったら、M FuatNUROĞLUの回答にも投票することを忘れないでください:)
同様の質問がありました。
以下は、後で別の状態変更者から呼び出されました。したくなかったので。
function foo() {
// this was called many times which was not needed
observable.subscribe(func);
changeObservableState("new value");
}
unsubscribe()
以下のようにサブスクライブした後で試してみることにしました。
function foo() {
// this was called ONE TIME
observable.subscribe(func).unsubscribe();
changeObservableState("new value");
}
subscribe(func).unsubscribe();
のようsubscribeOnce(func)
です。
私もそれがあなたを助けたと思います。