2017-08-01 15 views
1

私は角4のアプリを持っています。このアプリでは、私はpaypalにいくつかのサーバー作業を行い、(クライアントから)paypalサービスを持っています。RxJs - 最後の場所でobservableを購読する


 
@Injectable() 
 
export class PaypalService { 
 
    private readonly http: HttpApi; 
 

 
    constructor(private readonly httpFactory: HttpFactoryService) { 
 
    this.http = httpFactory.get(HttpRequestType.Secured); 
 
    } 
 

 
    checkout(transactionId: string): 
 
    Observable<Response> { 
 
    let subscriber = this.http.post(environment.paymentServer + '/pay', {transactionId: transactionId}) 
 
    subscriber.subscribe((response:Response) => { 
 
     let result = response.json(); 
 
     window.location.href = result.paymentUrl; 
 
    }); 
 
    return subscriber; 
 
    } 
 
}

私はwindow.location.hrefは、すべての加入者が通知された後にのみ呼び出されます欲しいです。

paypal.checkout("1234").subscribe(() => 
 
//This code should be called before the navigation will start 
 
doSomeCleaning())

私は遅延を使用することができます知っているが、より良いオプションがある場合、私は思っていました。

+0

てみ例えばflatMap'演算子 'とすべてのストリームをマッピングするために、最後にそのことができますから、リダイレクトを呼び出します。 –

答えて

0

オブザーバーを特定の順序で強制的に呼び出す必要があるため、サブスクリプションの順序に頼るべきではありません。

observable.subscribe((response:Response) => { 
    let result = response.json(); 
    setTimeout(() => window.location.href = result.paymentUrl); 
}); 

それとも、より良く、より多くのRxの方法は、別のJSイベントの最初の観察者に価値を発するようにobserveOnオペレータとasyncスケジューラを使用することができます最も簡単な方法は、遅滞なくsetTimeout()を使用することです。

import { async } from 'rxjs/scheduler/async'; 

... 

let observable = ... 
observable.observeOn(async).subscribe(...); 

return observable; 
+0

ありがとうございました。非同期ソリューションについてもう少し詳しく教えてください。 –

+0

あなたが知りたいことはありますか? – martin

+0

observable.observeOn(async)とは何ですか? –

0

は、なぜあなたは、次のようにコールバックでリダイレクトしないでください:1つの方法だけを購読持って

+0

他のコンポーネントがpaypalへのナビゲーションについて知りたくない –

関連する問題