2016-11-15 8 views
2

RxJSに関してはまだノーベルですが、ここでは私がしようとしていることのJSBinです。内側の観測が完了した時点でswitchMapが完了していないようです

https://jsbin.com/wusalibiyu/1/edit?js,console

私は、接続が再接続するたびに新しいオブジェクトを放出する「」(私の場合、それは現在のアクティブな接続です)、観察を持っています。新しい価値を再発信することができるので、それ自体は観測可能です。

現在、現在の接続でアクションが実行されるたびに完了するオブザーバブルが必要です。その動作は、それが観測可能であることが完了したときに行われることを通知します。これはbです。

内側の観測が完了すると、外側が完了しないという問題があります。外見を完全にする方法...。 RxJS5で使用しなければならない別の演算子がありますか?

答えて

7

私が正しくあなたの条件を理解していれば、あなたはmaterialize/dematerializeペアを使用して「リフト」内部ストリームアウトは(私はObservable#createを使用して停止するように人々を得るために、私の終わることのない戦争の一環としてだけでなくリファクタリング注意してください)することができます。

JsBin(以下抜粋)

function b(a) { 
    // Emit and complete after 100 millis 
    return Rx.Observable.timer(100) 

    // Ignore any values emitted 
    .ignoreElements() 

    // Emit the value on start 
    .startWith(a) 
    .do(() => console.log('creating observable')) 
    .finally(() => console.log('b done')); 
} 

var a$ = Rx.Observable.from(['a', 'b']) 
    .finally(() => console.log('a done')); 

var result$ = a$.switchMap(function(a) { 
    console.log('switching map for a to b', a); 

    // This "materializes" the stream, essentially it maps complete -> next 
    return b(a).materialize(); 
}) 
// This does the opposite, and converts complete events back, 
// but since we are now in the outer stream 
// this results in the outer stream completing as well. 
.dematerialize() 
.share(); 


result$.subscribe(function(value) { 
    console.log('value', value); 
}, function(e) { 
    console.error('e', e); 
}, function() { 
    console.log('completed!'); 
}) 

result$.toPromise().then(function(data) { 
    console.log('this should trigger!?', data); 
}, function(e) { 
    console.error('boom', e.toString()); 
}); 
+0

私はできるだけ近い状況を再現するために、できるだけ密接に私のプロジェクトからコードをコピーしました。私のコードでは、サードパーティライブラリをオブザーバブルにラッピングしています。私はこの場合正しいと信じています。しかし、マテリアライズ/ dematerializeは明らかに私が逃したものです。解決策を提供してくれてありがとう! – SpoBo

関連する問題