RxJS

2017-02-15 13 views
0

ここで条件(グローバル変数の存在)が満たされたときに期待されると、観察完成に結果として働いていたコードのレガシー約束ベースの作品です:RxJS

const fooPromise = new Promise(resolve => { 
    const interval = setInterval(() => { 
    if (window.foo) { 
     clearInterval(interval); 
     resolve(window.foo); 
    } 
    }, 100); 
}); 

setTimeout(() => { 
    window.foo = {}; 
}, 1000) 

const foo$ = Rx.Observable.fromPromise(fooPromise); 

foo$.subscribe(
    () => console.log('success'), 
    () => console.log('error'), 
    () => console.log('complete') 
); 

私は「すっきり観測可能な専用ソリューション、fiddleにそれを変換しようとは:m

'use strict'; 

setTimeout(() => { 
    window.foo = {}; 
}, 1000) 

const foo$ = Rx.Observable.interval(100).map(() => foo).retry(-1) 

foo$.subscribe(
    () => console.log('success'), 
    () => console.log('error'), 
    () => console.log('complete') 
); 

私は正しい軌道に乗ってんだけど、観測可能が完了し、値でスパム続けていないように見えます。

これを修正する適切な方法は何ですか?

答えて

1

は1つだけですfooを取るので、take(count) operatorを使用する必要があります。

観察可能な源から放出された唯一の最初のカウント値を出力します。

ソースから最初のカウント値を受け取り、完了します。

const foo$ = Rx.Observable.interval(100).map(() => foo).retry().take(1) 

Fiddle

+0

それは私の鼻の下に右であったおかげで、私は、間隔から退会する方法を考えてきました。 – estus

+0

エラーの代わりに 'filter(()=> window.foo)'を使用し、無限になるまで '再試行 'を使うことをお勧めします。これはエラーが予防可能であるため(*予想される*) –

+0

私はそれに同意する、私はこのようにしていたので、よりperformandより良い練習です。しかし、それは 'foo'だけでなく、' fooow.foo'だったことに気付かなかった。 – n00dl3