在Angular应用程序中,我通过将所有订阅推入数组中,然后在
ngOnDestroy
期间循环遍历并取消订阅来管理我的订阅。private subscriptions: Subscription[] = []
this.subscriptions.push(someObservable.subscribe(foo => bar))
我的问题是我还没有找到一个足够简洁的方法来处理取消订阅。理想的方式应该是一个简单的
。ngOnDestroy () {
this.subscriptions.forEach(subscription => subscription.unsubscribe())
}
但这样做不能起作用。值得注意的是,在注销后仍然会收到Firebase权限错误(在“有效”的方法中不会发生这种情况)。有趣的是,如果我将完全相同的方法提取到单独的类中,则可以起作用:
export class Utils {
public static unsubscribeAll (subObject: {subscriptions: Subscription[]}) {
subObject.subscriptions.forEach(subscription => subscription.unsubscribe())
}
}
// ---------- back to the component
ngOnDestroy () {
Utils.unsubscribeAll({subscriptions: this.subscriptions}) // no Firebase errors
}
但我并不太喜欢这种解决方案,主要是因为只有在将数组包装在对象中以便作为引用传递时才能起作用。我发现的另一种可行方法是将其编写为for循环:
ngOnDestroy () {
/* tslint:disable */
for (let i = 0; i < this.subscriptions.length; i++) {
this.subscriptions[i].unsubscribe()
}
/* tslint:enable */
}
除了长度不必要之外,它还会导致TSLint抱怨,因为它认为我应该使用for-of循环(但这行不通),所以我不得不每次加上额外的注释。
目前,我正在使用Utils选项作为“最佳”解决方案,但我仍然对此不满意。我有没有错过更简洁的方法呢?
subscriptions.forEach(subscription => subscription.unsubscribe())
相当于for (let i = 0; i < this.subscriptions.length; i++) {
。 - Max Koretskyithis.subscriptions
,而“不工作”的示例只是subscriptions
,这可能有关系吗?难道不应该使用this
来访问对象成员吗?除此之外,Rx.Subscription
允许添加新的订阅,然后一次性取消所有订阅,这意味着不需要数组:const subscription = new Rx.Subscription(); subscription.add(source1.subscribe()); subscription.add(source2.subscribe()); subscription.unsubscribe();
- Sergey KaravaevngOnDestroy
中取消订阅而不必跟踪大量订阅的方法。虽然并没有更容易,但是确实稍微简单了一点。 - Pace