NgRx 轮询实际上返回 ActionType

问题描述

所以我们有一个效果,当帖子完成并完成时,我们将其与其他一些数据进行切换映射,并根据响应应用一些逻辑。这反过来返回一个动作。现在在新案例中,我们添加了这个逻辑,在我们从必须轮询的请求中获得某个值之前,该逻辑不会返回任何内容。我们现在遇到的问题是如何实施这种轮询。

使用一些用于轮询的测试代码的完整效果

  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 (将#修改为@)