什么是订阅? Subscription 是一个对象,该对象代表一个一次性资源,通常是一个 Observable 的执行。 Subscription 有一个重要的方法,unsubscribe,它不接受任何参数,只处理订阅持有的资源。 在之前的 RxJS 版本中,订阅被称为“Disposable”。
看个例子:
import { interval } from 'rxjs';
const observable = interval(1000);
const subscription = observable.subscribe((x) => console.log(x));
// Later:
// This cancels the ongoing Observable execution which
// was started by calling subscribe with an Observer.
console.log('ok');
const handler = () => subscription.unsubscribe();
setTimeout( handler , 10000);
这行代码将在打印0~9 个数字后,也就是10秒后终止。
Subscription 本质上只有一个 unsubscribe() 函数来释放资源或取消 Observable 执行,避免内存泄漏。
也可以将一个 subscription 添加到另一个 subscription 里,然后同时关闭这两个 subscription:
import { interval } from 'rxjs';
const observable1 = interval(400);
const observable2 = interval(300);
const subscription = observable1.subscribe(x => console.log('first: ' + x));
const childSubscription = observable2.subscribe(x => console.log('second: ' + x));
subscription.add(childSubscription);
setTimeout(() => {
// Unsubscribes BOTH subscription and childSubscription
subscription.unsubscribe();
}, 1000);
在 SAP Spartacus 代码里,有时我们能看到手动新建一个新的 subscription:
原因正在于此:
将若干个 subscription 添加到同一个 subscription:
这样,在 Component 的 ngOnDestroy 方法里,我们就能用一个 subscription,通过调用一次 unsubscribe 就能关掉所有的子订阅了。
更多Jerry的原创文章,尽在:"汪子熙":
网友评论