【发布时间】:2018-07-28 19:34:31
【问题描述】:
我有一个可观察对象,我需要它像一个承诺一样行事,即链应该在创建时执行一次并导致热可观察对象。
这是一个例子:
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 毫秒
地图 1
100 毫秒
订阅 2
observable 需要额外订阅subscribe(),我想避免这种情况。
但这不适用于已完成的可观察对象:
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 毫秒
地图 1
地图 2
100 毫秒
订阅 2
订阅 3
实际输出:
0 毫秒
地图,1
地图,2
100 毫秒
地图,1
订阅 2
地图,2
订阅 3
每次订阅都会重新执行可观察链。
以Observable.of 和增量映射为例。 observable 和它的链都可能代价高昂,因此链应该只执行一次,类似于 promise。但我不能只切换到 promise,因为完成的 observable 中可以有多个值。
另一个问题是 Promise 容易受到 GC 的影响,不会导致内存泄漏。我不确定可观察订阅是否可以保证这一点。
如何使用操作员预先订阅 observable 以避免虚拟 subscribe()?
如何预先订阅具有多个值的已完成 observable 并避免多链执行?
可以像 Promise 一样对此类 observable 进行垃圾回收吗?
有类似的已回答问题,但我相信它们并不能解决所有问题。
【问题讨论】:
标签: javascript rxjs rxjs5