Как выполнить оператор преобразования rxjs, только если условие выполняется с угловым - PullRequest
3 голосов
/ 01 мая 2019

Я хочу проверить код купона с помощью вызова API на сервере, но сначала я должен проверить сеанс пользователя, потому что мне нужно, чтобы пользователь вошел в систему с действительным токеном сеанса.Если сеанс истек, я хочу показать диалог входа в систему и завершить поток, возможно, без ввода в следующем обратном вызове функции подписки, если сеанс все еще действителен, я хочу вызвать API для проверки купона и выполнить код вследующий обратный вызов функции подписки.

applyCouponCode() {
  const user = this.auth.getUser();
  if (user) { //verify if user is logged in
    if (this.couponCode.length !== 0) {
      this.auth.checkSession() //API call to verify if user session is still valid
        .pipe(
          tap((sessionValid) => {
            if (!sessionValid) {
              //session expired
              this.auth.clientLogout();
              this.auth.showLoginDialog();
            } else {
              //session valid, call the API to validate the coupon code
              mergeMap(() => this.reservation.validateCouponCode(this.couponCode, user.token));
            }
          })
        )
        .subscribe(
          discountCode => {
            if (discountCode.valid) {
              //create the discount code obj and apply to user cart
              ....
            } else {
              //notify discount code is invalid to the user
              ....
            }
          },
          error => {
            console.log('error', error);
          }
        );
    } else {
      this.emptyCouponSubmitted = true;
    }
  }
}

Другим возможным решением является рефакторинг операторов в функции конвейера

.pipe(
  tap((sessionValid) => {
    if (!sessionValid) {
      this.auth.clientLogout();
      this.auth.showLoginDialog();
    }
  }),
  mergeMap((sessionValid) => {
    if (sessionValid) {
      return this.reservation.validateCouponCode(this.couponCode, user.token));
    } else {
      // I would like to complete the stream without enter in the next callback
      return of(null);
    }
  })

Я хотел бы ввести следующий обратный вызов подписки только в том случае, еслиБыл вызван API для проверки кода купона, и я хочу завершить поток, если сеанс пользователя истек.Это правильно?Существуют ли более эффективные способы выполнения оператора mergeMap на основе предыдущего условия и завершения потока, если это условие не было выполнено?Как лучше всего справляться с подобными ситуациями?

1 Ответ

1 голос
/ 03 мая 2019

Я нашел решение своей проблемы.Я добавил оператор фильтра между краном и операторами mergeMap

.pipe(
   tap((sessionValid) => {
     if (!sessionValid) {
       this.auth.clientLogout();
       this.auth.showLoginDialog();
     }),
     filter(sessionValid => sessionValid),
     mergeMap(() => this.reservation.validateCouponCode(this.couponCode, user.token))
)

. Это происходит, если сессия истекла (sessionValid имеет значение false). Я могу отобразить диалоговое окно без вызова оператора mergeMap, посколькуПереданное значение фильтруется оператором фильтра, и поток завершается без ввода в следующем обратном вызове функции подписки, в противном случае вызывается mergeMap, и я могу управлять результатом нового потока в функции подписки.

...