I've had this service code written in rxjs 5 notation:
constructor(private _authService: AuthService) {
this._ws$ = WebSocketSubject.create<any>({
url: WS_URL,
protocol: this._authService.token
});
this._ws$.retryWhen(errors => {
// switchMap to retrieve the source error
return errors.switchMap(sourceErr => {
console.log('Retry WS.', sourceErr);
return Observable.timer(1000).map(() => Observable.of(true));
}
);
}
).subscribe(
msg => {
if ('channel_name' in msg) {
console.log('Channel name', msg.channel_name);
this._channelName = msg.channel_name;
this._authService.channelName = msg.channel_name;
}
this.subject$.next(msg);
console.log(msg);
},
err => {
console.log(err);
this.subject$.error(err);
},
() => this.subject$.complete()
);
}
I am trying to refactor it to rxjs 6 valid code and I have got this now:
constructor(private _authService: AuthService) {
this._ws$ = WebSocketSubject.create({
url: WS_URL,
protocol: this._authService.token
});
retryWhen(() => {
// switchMap to retrieve the source error
return switchMap(() => {
return timer(1000).pipe(map(() => of(true)));
}
);
}
).subscribe(
msg => {
if ('channel_name' in msg) {
this._channelName = msg.channel_name;
this._authService.channelName = msg.channel_name;
}
this.subject$.next(msg);
},
err => {
this.subject$.error(err);
},
() => this.subject$.complete()
);
But I am getting following error:
TS2345: Argument of type '() => OperatorFunction<{}, Observable<boolean>>' is not assignable to parameter of type '(errors: Observable<any>) => Observable<any>'.
Type 'OperatorFunction<{}, Observable<boolean>>' is not assignable to type 'Observable<any>'.
Property '_isScalar' is missing in type 'OperatorFunction<{}, Observable<boolean>>'.
I cannot figure out what is the best way of using retryWhen function here and how to use WebSocketSubject inside it.
An implementation of the above code in Rxjs 6 would look something like the below
this._ws$.pipe(
retryWhen(errors =>
errors.pipe(
tap(val => console.log('Retry WS.', val)),
delay(1000)
)
)).subscribe( msg => {
if ('channel_name' in msg) {
this._channelName = msg.channel_name;
this._authService.channelName = msg.channel_name;
}
this.subject$.next(msg);
},err => {
this.subject$.error(err);
},() => this.subject$.complete()
);
For more information on retry when with Rxjs 6 you can refer to here
https://www.learnrxjs.io/operators/error_handling/retrywhen.html
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments