Я хочу проверить код купона с помощью вызова 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 на основе предыдущего условия и завершения потока, если это условие не было выполнено?Как лучше всего справляться с подобными ситуациями?