为什么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);
        }
      });
    });
  }

这是我的日志enter image description here

答案

您可以从here中学习,或尝试此example

以上是关于为什么retryWhen在switchMap中不起作用(Ngrx Effects rxjs)的主要内容,如果未能解决你的问题,请参考以下文章

map() 和 switchMap() 方法有啥区别?

Angular 2:为啥在检索路由参数时使用 switchMap?

在 RxSwift 4.0.0 中正确使用 retryWhen 运算符

为啥 heightForHeaderInSection 在 iOS 4.3 中不起作用?

为啥这个下拉菜单在 IE 中不起作用?

Javascript 自动完成功能在 ascx 中不起作用