Почему retryWhen не работает внутри switchMap (Ngrx Effects rx js) - PullRequest
1 голос
/ 13 января 2020

Помогите мне, пожалуйста, почему повторная попытка, когда не работает внутри SwitchMap Ngrx Effects? Я делаю чат. Я отправляю данные через socket.io. Если sockect не подключен, я должен повторить все сообщения снова, например, после 1 се c. Но мой код не работает. Его только Retrying... в журнале. Какая проблема? Может быть, кто-нибудь подскажет мне лучшее решение для повторной отправки сообщений, когда нет соединения sockect.

Вот мой Эффект

 @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

...