我有一个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并避免多链执行?
这类可观察物是否可以被垃圾收集,类似于承诺?
有类似的回答问题,但我认为他们没有解决所有问题。
答案 0 :(得分:0)
observable需要使用额外的subscribe()进行订阅,我想避免这种情况。
你做不到。订阅是执行可观察时段的内容。这就像是说你想要调用函数myFunc
而不必编写括号myFunc()
。
有办法“隐藏”这样做,但它们会显着改变正在发生的事情。订阅仍然发生,它只是隐藏在运营商(你仍然需要调用)。例如,您可能需要connect
。
如何使用运算符预先订阅observable以避免虚拟订阅()?
一般来说,您希望多播您的observable。从原始multicast
到publish
,share
以及各种publish*
和share*
变体,有很多运营商可以实现这一目标。他们都做了稍微不同的事情,所以使用哪一个取决于你想做什么。
这类可观察物是否可以被垃圾收集,类似于承诺?
如果您正确管理订阅,GC将没有问题。但是,您确实需要确保所有订阅在不再需要时结束。
我发现自己无法给出一个特定的答案来实现您所希望的输出,因为它对我没有意义。由于您将发出的值(1,2)映射到它们的后继,因此生成的observable发出2和3.我不明白为什么订阅应该只发出2而不是3。