如何在 Angular2 中停止 observable.timer
How to Stop observable.timer in Angular2
我正在 Angular2 的组件中实现以下功能:
export class MypageEditComponent {
ngOnInit() {
this.timer = Observable.timer(100, 100);
this.timer.subscribe(t => {
this.setFormData();
}
private setFormData() {
this.editUserAcountType = this.authStore.registerInfo.account_type;
this.editAddress = this.authStore.registerInfo.email;
this.editUserName = this.authStore.registerInfo.username;
}
}
我想在 setFormData()
正确存储值后停止重复 Observable.timer
。
但是不知道怎么做,请告诉我。
当你想像这样停止可观察的计时器时,你可以使用 unsubscribe
方法
this.timer = Observable.timer(100, 100);
this.subscription = this.timer.subscribe(t => {
this.setFormData();
});
.............
this.subscription.unsubscribe();
基本上有两种方法:
- 对
subscribe()
调用返回的订阅对象调用 unsubscribe()
。
- 使用运算符
只是 unsubscribe
你可以这样做。
ngOnInit() {
this.subscription = timer(100, 100).subscribe(t => {
this.setFormData();
});
}
private setFormData() {
...
this.subscription.unsubscribe();
}
或者你可以使用 Subject 通过 takeUntil()
运算符完成 Observable:
this.subject = new Subject();
ngOnInit() {
timer(100, 100).pipe(
takeUntil(this.subject),
).subscribe(t => this.setFormData());
}
private setFormData() {
...
this.subject.next();
}
也看看这些:
2019 年 1 月:针对 RxJS 6 更新
之前的答案没有真正涵盖的细微差别是没有必要停止一个可观察的timer/interval——至少不需要通过与可观察的或计时器本身。
我发现自己在这里是因为我在 HostedService 的启动方法中使用计时器设置了一个 observable,而在停止方法中它 似乎 就像我应该的那样是停止它,还是肯定要处理一些东西? - 嗯...不。可观察计时器不需要以这种方式停止或处理,只需要订阅,这就是为什么...
可观察的计时器和间隔是 冷流 的示例(尽管它们看起来像热流)。它们是被动的而不是主动的,它们在订阅之前不产生数据,并且在没有订阅者时停止产生数据。因此,处理所有订阅应该是停止计时器生成数据所需的全部。
此处有更多信息...[http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html]
xD 你知道你可以做出承诺吗?
import { timer } from 'rxjs';
timer(1000).toPromise().then(res => {
//code here
})
无需处理退订。
-- 解决方法
setTimeout(() => observable.next(null) , 2000);
我正在 Angular2 的组件中实现以下功能:
export class MypageEditComponent {
ngOnInit() {
this.timer = Observable.timer(100, 100);
this.timer.subscribe(t => {
this.setFormData();
}
private setFormData() {
this.editUserAcountType = this.authStore.registerInfo.account_type;
this.editAddress = this.authStore.registerInfo.email;
this.editUserName = this.authStore.registerInfo.username;
}
}
我想在 setFormData()
正确存储值后停止重复 Observable.timer
。
但是不知道怎么做,请告诉我。
当你想像这样停止可观察的计时器时,你可以使用 unsubscribe
方法
this.timer = Observable.timer(100, 100);
this.subscription = this.timer.subscribe(t => {
this.setFormData();
});
.............
this.subscription.unsubscribe();
基本上有两种方法:
- 对
subscribe()
调用返回的订阅对象调用unsubscribe()
。 - 使用运算符
只是 unsubscribe
你可以这样做。
ngOnInit() {
this.subscription = timer(100, 100).subscribe(t => {
this.setFormData();
});
}
private setFormData() {
...
this.subscription.unsubscribe();
}
或者你可以使用 Subject 通过 takeUntil()
运算符完成 Observable:
this.subject = new Subject();
ngOnInit() {
timer(100, 100).pipe(
takeUntil(this.subject),
).subscribe(t => this.setFormData());
}
private setFormData() {
...
this.subject.next();
}
也看看这些:
2019 年 1 月:针对 RxJS 6 更新
之前的答案没有真正涵盖的细微差别是没有必要停止一个可观察的timer/interval——至少不需要通过与可观察的或计时器本身。
我发现自己在这里是因为我在 HostedService 的启动方法中使用计时器设置了一个 observable,而在停止方法中它 似乎 就像我应该的那样是停止它,还是肯定要处理一些东西? - 嗯...不。可观察计时器不需要以这种方式停止或处理,只需要订阅,这就是为什么...
可观察的计时器和间隔是 冷流 的示例(尽管它们看起来像热流)。它们是被动的而不是主动的,它们在订阅之前不产生数据,并且在没有订阅者时停止产生数据。因此,处理所有订阅应该是停止计时器生成数据所需的全部。
此处有更多信息...[http://introtorx.com/Content/v1.0.10621.0/14_HotAndColdObservables.html]
xD 你知道你可以做出承诺吗?
import { timer } from 'rxjs';
timer(1000).toPromise().then(res => {
//code here
})
无需处理退订。
-- 解决方法
setTimeout(() => observable.next(null) , 2000);