.unsubscribe 与 .take(1) 之间的区别
Difference between .unsubscribe to .take(1)
我想知道,在订阅后立即使用 unsubscribe
时,使用 .take(1)
和 .unsubscribe
之间的性能是否有任何差异:
var observable = Rx.Observable.interval(100);
第一个:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();
第二个:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});
对性能有什么不同的看法吗?
每个都有不同的用途,因此很难进行比较。
一般来说,如果你采用这个来源:
const source = range(1,3);
... 并用 subscribe()
消耗它,紧接着 unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
... 那么来自 source
的所有值都将被发出,即使我们在订阅后立即调用了 unsubscribe()
。这是因为代码仍然是严格顺序的(同步的)并且 source
是一个冷 Observable。
1
2
3
complete
顺便说一句,尝试添加 delay(0)
运算符来生成 source.pipe(delay(0)).subscribe(...).unsubscribe()
。这使得发射值使用实际的 setTimeout()
调用异步,因此 unsubscribe()
在任何 next
处理程序之前被调用并立即被丢弃。
换句话说,unsubscribe()
让您随时停止接收值。即使源没有发出任何值(我们从未收到任何完整的通知)。
使用 take()
运算符将链限制为仅发出特定数量的值。
source.pipe(
take(1),
)
.subscribe(
console.log,
undefined,
() => console.log('complete')
);
这只是发出一个值并完成:
1
complete
即使加上 .unsubscribe()
结果也是一样的。
观看现场演示:https://stackblitz.com/edit/rxjs-tbu5kb
所以 take()
是一个运算符,而 unsubscribe()
是 Subscription
对象上的一个方法。这两件事通常可以互换,但它们永远不会完全相互替代。
2019 年 1 月:针对 RxJS 6 更新
Just keep in mind that take(1) still doesn’t unsubscribe when
component is being destroyed. The subscription remains active until
first value is emitted no matter if component is active or destroyed.
So if we do something more crazy, like accessing the DOM, in our
subscription — we might end up with an error in the console.
我想知道,在订阅后立即使用 unsubscribe
时,使用 .take(1)
和 .unsubscribe
之间的性能是否有任何差异:
var observable = Rx.Observable.interval(100);
第一个:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();
第二个:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});
对性能有什么不同的看法吗?
每个都有不同的用途,因此很难进行比较。
一般来说,如果你采用这个来源:
const source = range(1,3);
... 并用 subscribe()
消耗它,紧接着 unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
... 那么来自 source
的所有值都将被发出,即使我们在订阅后立即调用了 unsubscribe()
。这是因为代码仍然是严格顺序的(同步的)并且 source
是一个冷 Observable。
1
2
3
complete
顺便说一句,尝试添加 delay(0)
运算符来生成 source.pipe(delay(0)).subscribe(...).unsubscribe()
。这使得发射值使用实际的 setTimeout()
调用异步,因此 unsubscribe()
在任何 next
处理程序之前被调用并立即被丢弃。
换句话说,unsubscribe()
让您随时停止接收值。即使源没有发出任何值(我们从未收到任何完整的通知)。
使用 take()
运算符将链限制为仅发出特定数量的值。
source.pipe(
take(1),
)
.subscribe(
console.log,
undefined,
() => console.log('complete')
);
这只是发出一个值并完成:
1
complete
即使加上 .unsubscribe()
结果也是一样的。
观看现场演示:https://stackblitz.com/edit/rxjs-tbu5kb
所以 take()
是一个运算符,而 unsubscribe()
是 Subscription
对象上的一个方法。这两件事通常可以互换,但它们永远不会完全相互替代。
2019 年 1 月:针对 RxJS 6 更新
Just keep in mind that take(1) still doesn’t unsubscribe when component is being destroyed. The subscription remains active until first value is emitted no matter if component is active or destroyed. So if we do something more crazy, like accessing the DOM, in our subscription — we might end up with an error in the console.