2016-05-27 10 views
2

Observablesは私には新しいものなので、それが可能であるかどうかはわかりません(しかし、それは推測できます)。私が達成したいのは、観測値(Angular 2 http.get呼び出し)を持っていて、変数が変更されたときにに一度を登録することです。RxJS Observable - 条件が満たされるたびに1回購読する

let x = false; 
// ... somewhere later I change "x" to true 
subscribe gets called once, x => false 
// stuffs happening, 10 minutes later x => true again 
subscribe gets called once, x => false 

大きなコンセプトはのlocalStorageでトークンの変更があるたびに、私はUserServiceを持っているでしょうし、コンストラクタで、私は一度/api/user/meを購読するだろうということです。例の流れはこのようなものになるだろう。これは有効なユースケースですか、もしそうなら、私はどのようにオブザーバブルでそれを行うことができますか?このような

+0

だから、ローカルストレージが変更されるたびにAPIコール(1回)を行うことをやりたいですか?ちょうどあなたがしたいことをしようとするので、私はまともな答えを与えることができます.. – Nypan

+0

うん、それは基本的にそれです。ローカルのストレージ項目が変更され、nullでないたびにAPI呼び出し(1回)を行います。 – Andrew

答えて

1

何かがトリックを行う必要があります:あなたはAPI呼び出しをトリガーしたいとき

// Observable that on subscription will result in an api call. It would 
// naturaly have another type in an acaual use case. 
let apiCallObservable : Rx.Observable< { someResult: any }>; 

let localStorageChangedObservable = new Rx.Subject<boolean>() 

localStorageChangedObservable 
    // only care about local storage change if not null 
    // This is just an example the type of localStorageChangedObservable 
    // could be anything you want, and you could check anything you want in the 
    // "where" 
    .where(v => v != null) 
    .selectMany(() => 
     // Take one is to make sure we terminate apiCallObservable after recieving 
     // one result from it. 
     apiCallObservable.take(1)) 
    .subscribe(
     (result: { someResult: any}) => { 

      // here we would have the result from the call to apiCallObservable 
     }); 

// To execute the chain abouve we would pass values to the localStorageChangedObservable 
// subject like this: 

localStorageChangedObservable.onNext(true); // results in api call and result in subscribe 
localStorageChangedObservable.onNext(null); // results in nothing. 
localStorageChangedObservable.onNext(false); // results in api call and result in subscribe 

をしたがって、基本的localStorageChangedObservable.onNext(...)に何かを渡します。

+1

'プロパティ'に 'タイプに存在しない'という問題があります。件名 '.'それは 'filter'でしょうか? – Andrew

+0

これは、角度2に関連する問題だと思います。デフォルトでangleよりも多くのrxjを含める必要があります(私は角度の苦しみではありません)。ここにrxjsリポジトリhttps://github.com/Reactive-Extensions/RxJSがあり、rx.all.jsをdistフォルダにすべて使用することができます。そして、私はまた、JavaScriptスクリプトではなく、スクリプトスクリプトで自分のアンサーを書いたことを理解しました。 – Nypan

+0

ええ、私はtypescriptを使用していますので、それはクールです、ありがとう!私は 'where'を' filter'と 'selectMany'で' flatMap'に置き換えました。それは動作しているように見えますが、すべての変更に対して3つの要求がありますが、それは角度に関係していると確信しています!再度、感謝します! – Andrew

関連する問題