【发布时间】:2019-05-22 10:55:00
【问题描述】:
我有一个 Observable,它在调用外部 api 的回调时发出。我想跳过(n)个排放,其中 n 是订阅 observable 的订阅者数量。
例如:订阅 2nd 的订阅者应该只收到第二个发射然后取消订阅。
skip 运算符不起作用,因为订阅数量可能会发生变化。
https://stackblitz.com/edit/rxjs-qdnh9f
let toSkip = 0;
const source = () => {
return Observable.create((observer) => {
toSkip++;
// External API callback
const handler = (count) => () => {
observer.next(count++);
};
const interval = setInterval(handler(1), 1000)
const unsubscribe = () => {
toSkip--;
console.log('clear interval');
clearInterval(interval)
}
observer.add(unsubscribe);
}).pipe(
skip(toSkip),
take(1)
);
}
const subscription1 = source().subscribe(x => console.log('subscription1', x));
const subscription2 = source().subscribe(x => console.log('subscription2', x));
// subscription3 should emit "2" as subscription2 will unsubscribe never run
const subscription3 = source().subscribe(x => console.log('subscription3', x));
setTimeout(() => {
subscription2.unsubscribe();
}, 500);
Subscription3 应该发出“2”,因为 subscription2 将在调用之前取消订阅。
控制台上的预期输出:
clear interval
subscription1 1
clear interval
subscription3 2
clear interval
【问题讨论】:
-
这是一个有点棘手的用例。由于我们可以控制排除排放,但订阅是不可避免的。我们所有的 observables 都是冷的,一旦订阅完成就会执行。
标签: javascript rxjs