问题描述
所以我们有一个效果,当帖子完成并完成时,我们将其与其他一些数据进行切换映射,并根据响应应用一些逻辑。这反过来返回一个动作。现在在新案例中,我们添加了这个逻辑,在我们从必须轮询的请求中获得某个值之前,该逻辑不会返回任何内容。我们现在遇到的问题是如何实施这种轮询。
createdorUpdatedReservation$ = createEffect(() =>
this.actions$.pipe(
ofType(createdReservation,updatedReservation),withLatestFrom(this.stripeService.elements$,this.stripeService.stripe$),switchMap(([{ reservationResponse },stripeElements,stripe]) => {
if (reservationResponse.paymentProvider === PaymentProvider.Stripe) {
const stripeCardElement: StripeCardElement | null = stripeElements.getElement(
'card'
);
let paymentOrSetupIntent: Promise<any>;
const paymentMethod = {
card: stripeCardElement as StripeCardElement,...(reservationResponse.paymentMethod && {
Metadata: {
ReferenceId: reservationResponse.paymentMethod,ReferenceType: 'PaymentMethod',},}),};
if (reservationResponse.paymentType === PaymentType.PaymentIntent) {
paymentOrSetupIntent = stripe.confirmCardPayment(
reservationResponse.paymentReference,{
payment_method: paymentMethod,}
);
} else {
paymentOrSetupIntent = stripe.confirmCardSetup(
reservationResponse.paymentReference,}
);
}
return from(paymentOrSetupIntent).pipe(
map(({ intent,error }) => {
if (error) {
return FailedPayingReservation({
error: stripeErrorToErrorResponse(error),});
}
return payedReservation();
}),catchError((error: StripeError) => {
return of(
FailedPayingReservation({
error: stripeErrorToErrorResponse(error),})
);
})
);
}
else {
// new logic
if(reservationResponse.paymentProvider === PaymentProvider.Adyen){
console.log("Payment provider is adyen");
if(reservationResponse.paymentType === PaymentType.PaymentIntent){
console.log("is paymentIntent");
var stopPolling = new Subject();
var test = timer(0,1000).pipe(
//tap(() => console.log("test")),switchMap((time: number)=>{
console.log("Polling: " + reservationResponse.paymentId )
if(reservationResponse.paymentId != null){
return this.paymentService.getPaymentStatus(reservationResponse.paymentId)
}
return Observable.throw(new Error());
}),map(response => {
console.log(response)
if(response.status === PaymentStatus.Authorized || response.status === PaymentStatus.CaptureRequested || response.status === PaymentStatus.Succeeded){
console.log("payment succesfull")
stopPolling.next();
return payedReservation();
}
if(response.status === PaymentStatus.Failed || response.status === PaymentStatus.Cancelled){
console.log("payment Failed")
stopPolling.next()
return FailedPayingReservation({error: errorResponse()})
}
// If none of these 2 are met keep polling
}),ofType(createdReservation,FailedPayingReservation),retry(),takeuntil(stopPolling))
}else{
return from(['1']).pipe(
map(() => {
return payedReservation();
})
);
}
// end new logic
}else{
if (reservationResponse.paymentAction === undefined) {
return from(['1']).pipe(
map(() => {
return payedReservation();
})
);
} else {
return empty();
}
}
return empty();
}
})
)
);
新逻辑:
if(reservationResponse.paymentProvider === PaymentProvider.Adyen){
console.log("Payment provider is adyen");
if(reservationResponse.paymentType === PaymentType.PaymentIntent){
console.log("is paymentIntent");
var stopPolling = new Subject();
var test = timer(0,takeuntil(stopPolling))
}else{
return from(['1']).pipe(
map(() => {
return payedReservation();
})
);
}
我们已经尝试了几件事,包括制作新效果和在那里进行轮询,但似乎没有得到我们需要的结果。任何人都可以引导我们朝着正确的方向前进。
注意:提供的代码来自多次测试,我知道它不能完全工作。
谢谢!
阿诺
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)