当内部可观察对象完成时,switchMap 似乎没有完成
switchMap does not seem to complete when the inner observable completes
说到 RxJS,我仍然是个菜鸟,但这是我正在尝试做的事情的 JSBin。
https://jsbin.com/wusalibiyu/1/edit?js,console
我有一个可观察的 'a'(在我的例子中它是当前的活动连接),只要连接重新连接就会发出一个新对象。它本身就是一个可观察对象,因为它可以重新发出一个新值。
我现在想要一个在当前连接上执行操作时完成的可观察对象。当它的可观察对象完成时,该操作会通知它已完成。这是b.
问题是当内部 observable 完成时,外部 observable 没有完成。如何使外部 observable 完整......我应该在 RxJS5 中使用不同的运算符吗?
如果我正确理解您的要求,您可以使用 materialize
/dematerialize
对 "lift" 内部流出(注意我重构以及我永无止境的一部分 war 得到人们停止使用 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());
});
说到 RxJS,我仍然是个菜鸟,但这是我正在尝试做的事情的 JSBin。
https://jsbin.com/wusalibiyu/1/edit?js,console
我有一个可观察的 'a'(在我的例子中它是当前的活动连接),只要连接重新连接就会发出一个新对象。它本身就是一个可观察对象,因为它可以重新发出一个新值。
我现在想要一个在当前连接上执行操作时完成的可观察对象。当它的可观察对象完成时,该操作会通知它已完成。这是b.
问题是当内部 observable 完成时,外部 observable 没有完成。如何使外部 observable 完整......我应该在 RxJS5 中使用不同的运算符吗?
如果我正确理解您的要求,您可以使用 materialize
/dematerialize
对 "lift" 内部流出(注意我重构以及我永无止境的一部分 war 得到人们停止使用 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());
});