当内部observable完成时,switchMap似乎没有完成

时间:2016-11-15 13:35:03

标签: rxjs rxjs5

当谈到RxJS时,我仍然是一个菜鸟,但这是我想要做的JSBin。

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

我有一个可观察的'a'(在我的情况下,它是当前的活动连接),每当连接重新连接时,它会发出一个新对象。它本身就是可观察的,因为它可以重新发出一个新值。

我现在想要一个只在当前连接上执行操作时完成的observable。该操作通知它在完成后可观察时完成。这是b。

问题是当内部可观察者完成时,外部没有完成。如何使外部可观察完整......我应该在RxJS5中使用不同的运算符吗?

1 个答案:

答案 0 :(得分:9)

如果我正确理解您的要求,您可以提升"内部流使用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());
});