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