debounceTime() の後に起動するユーザー名検索入力に取り組んでいます。また、値を除外します。値がフィルタリングされた場合に何らかの副作用を引き起こしたい (エラー メッセージの設定やローダーの停止など)。
私は現在、tap() を使用し、後で filter() 関数でチェックインするのと同じ述語をチェックすることで、これを達成しています。これは悪いと思います/これを達成するためのより適切な方法があります。
private setUserSearchObservable() {
this.userSearch = userSearch$.pipe(
tap(() => this.loading = true),
debounceTime(500),
this.filterValuesWithErrorMessages(),
......
);
}
private filterValuesWithErrorMessages() {
return pipe(
tap((val: string) => { if (this.usernamesMatch(val)) { this.errorMessage = 'You will be added to the frame automatically'; this.loading = false; }}),
tap((val: string) => { if (this.usernameInArray(val)) { this.errorMessage = 'User is already added'; this.loading = false; }}),
tap((val: string) => { if (val.length < 2) { this.errorMessage = ''; this.loading = false; }}),
filter((val: string) => (val.length >= 2 && !this.usernamesMatch(val) && !this.usernameInArray(val))),
);
}
ご覧のとおり、filter() で使用する直前に、tap() を使用してまったく同じ条件を明示的にチェックします。より簡潔な方法でこれを達成できる演算子/別のパターンはありますか?