2017-12-04 26 views
-1

トランザクションステータスが '保留中'の場合は条件があり、トランザクションステータスが '完了'になるまでトランザクションをリロードしてサブスクライブします。 '拒否されました'。私のコードは初めてのみ、次回の訪問時にはページが空白ですが、データを登録解除したにもかかわらずデータはコンソールで実行されます。ページを更新せずに条件付きで角度2+リフレッシュリアルタイムデータを条件付きで

は、ここに私のコードです:

export class TransactionSummaryComponent implements OnInit, OnDestroy { 

    transaction: Models.Transaction = <Models.Transaction>{}; 

    cancelling: boolean = false; 
    goToPayment: boolean = false; 

    private dataRefreshSub: Subscription; 
    private subscribeToDataSub: Subscription; 
    private timer: Observable<any>; 

    constructor(
    private route: ActivatedRoute, 
    private router: Router, 
    private apiService: ApiService, 
    private zone: NgZone, 
    @Inject(PLATFORM_ID) private platformId: Object) { } 

    ngOnInit() { 
    if (isPlatformBrowser(this.platformId)) { 
     this.getTransaction(); 
    } 
    } 

    getTransaction() { 
    this.route.paramMap 
    .switchMap((params: ParamMap) => this.apiService.getTransaction(params.get('id'))) 
    .subscribe((transaction: Models.Transaction) => { 
     this.transaction = transaction; 

     if (this.transaction.status === 'Pending') { 
     this.refreshData(); 
     } 
    }); 
    } 

    refreshData() { 
    this.dataRefreshSub = this.route.paramMap 
     .switchMap((params: ParamMap) => this.apiService.getTransaction(params.get('id'))) 
     .subscribe((transaction: Models.Transaction) => { 
     this.transaction = transaction; 
     this.subscribeToData(); 
     }); 
    } 

    subscribeToData() { 
    this.zone.runOutsideAngular(() => { 
     NgZone.assertNotInAngularZone(); 
     this.timer = Observable.timer(1, 5000); 
     this.subscribeToDataSub = this.timer 
     .subscribe(() => { 
      this.refreshData(); 
     }); 
    }); 
    } 

    ngOnDestroy() { 
    if (this.dataRefreshSub !== undefined) { 
     this.dataRefreshSub.unsubscribe(); 
    } 
    if (this.subscribeToDataSub !== undefined) { 
     this.subscribeToDataSub.unsubscribe(); 
    } 
    } 
} 
+1

あなたは複数のネストされたサブスクリプションを持っています。これは常に反パターンであり、最新のリフレッシュサブスクリプションからのみサブスクライブしています。他のすべてのサブスクリプションへの参照は失われます。 – bryan60

+0

そして何が問題なのですか?何を試しましたか?あなたはどんな問題に直面していますか?これは "私のコードplz"のウェブサイトを修正したものではありません.... – olivarra1

+0

@ bryan60申し訳ありません、あなたは何を意味しているのですか、私はすべての定期購読を取り消そうとします –

答えて

1

私は副作用を使用しない解決策を考え出すことができませんでしたが、私はそれはあなたを助けるかもしれないと思います。 Rxjsにはretry()演算子があります。この演算子は、スローされたときにサブスクリプションを再実行します。だから、私は次のようなことをします:

getTransaction() { 
    this.route.paramMap 
     .switchMap((params: ParamMap) => this.apiService 
      .getTransaction(params.get('id')) 
      .do(transaction => this.transaction = transaction) // Bad side effect here, I'm not sure how can this be cleaned out. 
      .map(transaction => { 
       if(transaction.status === 'Pending') { 
        throw 'Pending'; 
       } 
       return transaction; 
      }) 
      // use .retry(N) to retry at most N times. This will infinitely retry 
      .retryWhen(errors => errors) 
     ) 
     .subscribe((transaction: Models.Transaction) => { 
      // Here transaction will be 'Completed' or 'Rejected' 
     }); 
} 

これで、他のすべてのサブスクリプションを理論的に削除することができます。

+0

私はあなたの解決策を試していないが、私はそうするだろう。私はサービスからのデータをリフレッシュするソリューションを考え出しましたが、この回答(https://stackoverflow.com/questions/44947551/angular2-4-refresh-data-realtime/44947870#44947870)で購読しませんでした。ブライアンが私の脱退の問題について上記で述べたように、私はこの回答で脱退の方法も更新しました(https://stackoverflow.com/questions/38008334/angular-rxjs-when-should-i-unsubscribe-from-subscription/41177163 #41177163)。とにかくありがとうございました。 –

+0

申し訳ありませんが、解決策もうまくいきますが、あなたが述べたように悪影響はありませんでした。 –

+1

@HoàngNguyễn ".do(...)"は "副作用"と呼ばれています。Rxjs演算子は純粋ので、ストリームの宣言を見ることで全体の画像を知ることができます。その間に「this」を使用することは悪い習慣とみなされ、それを回避する方法を考えるのは良いことです。それ以外のオプションがない場合は大丈夫です。多くの場合、それらは完全に受け入れられます( '.switchMap(params => this.apiService.getTransaction(...))'のように)。あなたが完璧なクリーンなコードになっていない場合は、あまり心配しないでください。 – olivarra1