微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NgRx 轮询实际上返回 ActionType

如何解决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 举报,一经查实,本站将立刻删除。