gpt4 book ai didi

angular - 如何仅在满足条件时执行 rxjs 转换运算符

转载 作者:太空狗 更新时间:2023-10-29 18:35:26 26 4
gpt4 key购买 nike

我想通过对服务器的 API 调用来验证优惠券代码,但首先我必须检查用户 session ,因为我需要用户使用有效的 session token 登录。如果 session 已过期,我想显示一个登录对话框并完成流,可能无需在订阅函数的下一个回调中输入,如果 session 仍然有效,我想调用 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 被调用时,我才想进入订阅下一个回调,如果用户的 session 已过期,我想完成流。这是正确的吗?是否有更好的方法来根据先前的条件执行 mergeMap 运算符并在不满足该条件的情况下完成流?管理此类情况的最佳做法是什么?

最佳答案

我找到了解决问题的方法。我在 tap 和 mergeMap 运算符之间添加了一个过滤器运算符

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

这样做,如果 session 已过期(sessionValid 为 false),我可以在不调用 mergeMap 运算符的情况下显示对话框,因为发出的值由过滤器运算符过滤并且流完成而无需在下一个回调中输入订阅函数,否则调用 mergeMap,我可以在订阅函数中管理新流的结果。

关于angular - 如何仅在满足条件时执行 rxjs 转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55937275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com