为什么retryWhen在switchMap中不起作用(Ngrx Effects rxjs)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么retryWhen在switchMap中不起作用(Ngrx Effects rxjs)相关的知识,希望对你有一定的参考价值。
[请帮帮我,为什么retryWhen在switchMap Ngrx Effects中不起作用?我聊天。我通过socket.io发送数据。如果未连接sockect,我将如何重试所有消息,例如1秒钟后。但是我的代码不起作用。它是日志中唯一的Retrying...
。怎么了也许有人告诉我最好的解决方案,以便在没有对接连接时重新发送邮件。
这是我的效果
@Effect() sendSupportMessage$ = this.actions$.pipe(
ofType(SEND_SUPPORT_MESSAGE),
map((action: CustomAction) => action),
map((action: SendSupportMessage) => action.payload),
switchMap(payload => {
return this.socketService.sendSupportMessage(payload.message).pipe(
map(() => new ChatActions.SendSupportMessageComplete(payload)),
retryWhen(error$ =>
error$.pipe(
delay(1000),
tap((errorStatus: MyError) => {
if (errorStatus.name !== ERROR_SOCKET_NOT_CONNECTED) {
throw errorStatus;
}
console.log("Retrying...");
})
)
),
catchError((error: MyError) => {
return of(new ChatActions.SendSupportMessageError(payload));
})
);
})
);
这是我的套接字方法
public sendSupportMessage(data: Message): Observable<void> {
console.log("sendSupportMessage", data);
return this.sendData(data, EVENTS.SUPPORT_MESSAGE);
}
private sendData(data: any, event: EVENTS): Observable<any> {
if (!this.isConnected$.getValue()) {
console.error(ERROR_SOCKET_NOT_CONNECTED, event, data);
const myError: MyError = {
code: 1,
message: ERROR_SOCKET_NOT_CONNECTED,
name: ERROR_SOCKET_NOT_CONNECTED
};
return throwError(myError);
}
return new Observable<any>(observer => {
this.socket.emit(event, data, function(responseData: Result<any>) {
console.log("Data sended", responseData);
if (responseData.success === true) {
observer.next(responseData.data);
observer.complete();
} else {
console.error("Data not sended", responseData);
observer.error(data);
}
});
});
}
答案
以上是关于为什么retryWhen在switchMap中不起作用(Ngrx Effects rxjs)的主要内容,如果未能解决你的问题,请参考以下文章
Angular 2:为啥在检索路由参数时使用 switchMap?
在 RxSwift 4.0.0 中正确使用 retryWhen 运算符