共享预订的RxJS可观察量

时间:2018-02-18 11:58:16

标签: javascript rxjs rxjs5

我有一个observable,我需要它像一个promise,即链应该在创建时执行一次并导致热观察。

以下是一个例子:

console.log('0 ms');

var foo$ = new Observable(obs => obs.next(1))
.map(v => {
  console.log('map, ' + v);
  return v + 1;
})
.share();

foo$.subscribe(); // would like to skip this

setTimeout(() => {
  console.log('100 ms');
  foo$.subscribe(v => { console.log('subscribe, ' + v); });
});

它产生了理想的输出:

  

0 ms

     

地图1

     

100毫秒

     

订阅2

观察者需要额外subscribe()订阅,我想避免这种情况。

但这不适用于已完成的observable:

console.log('0 ms');

var bar$ = new Observable(1, 2)
.map(v => {
  console.log('map, ' + v);
  return v + 1;
})
.share();

bar$.subscribe(); // would like to skip this

setTimeout(() => {
  console.log('100 ms');
  bar$.subscribe(v => { console.log('subscribe, ' + v); });
});

期望的输出:

  

0 ms

     

地图1

     

地图2

     

100毫秒

     

订阅2

     

订阅3

实际输出:

  

0 ms

     

地图,1

     

地图,2

     

100毫秒

     

地图,1

     

订阅2

     

地图,2

     

订阅3

每次订阅都会重新执行可观察链。

Observable.of和增量图用作示例。可观察的和它的链都可能是昂贵的,因此链应该只执行一次,类似于承诺。但是我不能只是切换到promises,因为在完成的observable中可以有多个值。

另一个问题是承诺对GC很敏感,不会导致内存泄漏。我不确定可观察的订阅是否可以保证。

如何使用运算符预先订阅可观察量以避免虚拟subscribe()

怎样才能预先订阅多个值的observable并避免多链执行?

这类可观察物是否可以被垃圾收集,类似于承诺?

有类似的回答问题,但我认为他们没有解决所有问题

1 个答案:

答案 0 :(得分:0)

  

observable需要使用额外的subscribe()进行订阅,我想避免这种情况。

你做不到。订阅是执行可观察时段的内容。这就像是说你想要调用函数myFunc而不必编写括号myFunc()

有办法“隐藏”这样做,但它们会显着改变正在发生的事情。订阅仍然发生,它只是隐藏在运营商(你仍然需要调用)。例如,您可能需要connect

  

如何使用运算符预先订阅observable以避免虚拟订阅()?

一般来说,您希望多播您的observable。从原始multicastpublishshare以及各种publish*share*变体,有很多运营商可以实现这一目标。他们都做了稍微不同的事情,所以使用哪一个取决于你想做什么。

  

这类可观察物是否可以被垃圾收集,类似于承诺?

如果您正确管理订阅,GC将没有问题。但是,您确实需要确保所有订阅在不再需要时结束。

我发现自己无法给出一个特定的答案来实现您所希望的输出,因为它对我没有意义。由于您将发出的值(1,2)映射到它们的后继,因此生成的observable发出2和3.我不明白为什么订阅应该只发出2而不是3。