Я нашел странное поведение rxjs , которое меня беспокоит, и я даже не могу представить решение этой проблемы. А затем испускайте из субъекта a null значение.
Все работает так, как предполагалось, но подписчик этого наблюдаемого продолжает потреблять ошибку, которая испускалась после первой подписки, даже с первым () оператором.
Как это возможно?import { Subject, throwError, of } from 'rxjs';
import { switchMap, tap, first } from 'rxjs/operators';
var subj$ = new Subject();
var obs$ = subj$.asObservable().pipe(
switchMap((v) => {
if (!v) {
return throwError(() => 'ERROR');
}
return of(v);
})
);
obs$
.pipe(
first(),
tap({
next(v) {
console.log('obs$', v);
},
error(err) {
console.error('obs$ error', err);
},
}),
tap(() => subj$.next(null))
)
.subscribe();
subj$.next('VALUE');
// obs$ VALUE
// obs$ error ERROR 'Unauthenticated.');
}
return of(user);
})
);
constructor(private socketService: SocketService) {}
authenticate(user: User) {
this.isAuthenticatedSource.next(true);
this.userSource.next(user);
return this.socketService.emit('join', user);
}
// consumes the error from second emission
deauthenticate() {
return this.user$.pipe(
first(),
switchMap((user: User) => this.socketService.emit('leave', user)),
tap(() => {
this.isAuthenticatedSource.next(false);
this.userSource.next(null);
})
);
}
}
class SocketService {
socket = {
emit(event: string, data: any, ack: (res: any) => any) {
return { event, data, ack };
}
}
emit(event: string, data: any): Observable {
return new Observable(subscriber => {
this.socket.emit(event, data, (res) => {
subscriber.next(res);
subscriber.complete();
})
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... perator-if
Почему подписчик субъекта продолжает потреблять ошибку после первого () оператора (), если следующее излучение этого суб ⇐ Javascript
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение