You can use scanning and asynchronous use to your advantage:
@Component({
selector: 'my-app',
template: `
<div>
<h1>Countdown timer</h1>
<h2>{{countDown | async}}</h2>
<button [disabled]="(countDown | async) === 0">My button</button>
</div>
`,
})
export class App {
countDown;
counter = 10;
constructor() {
this.countDown = Observable.timer(0,1000)
.scan((current, next) => this.counter - next)
.takeWhile(counter => counter >= 0);
}
}
: https://plnkr.co/edit/bKESzNK1wqbtPmQk4TUT?p=preview
, , ( )
OLD ANSWER
.takeWhile
this.countDown = Observable.timer(0,1000)
.take(this.counter)
.map(() => --this.counter)
.takeWhile(counter => counter >= 0);
plnkr: https://plnkr.co/edit/Z6K5Yt2tDS4MKbgIoujc?p=preview
.take :
this.countDown = Observable.timer(0,1000)
.map(() => this.counter--)
.takeWhile(counter => counter >= 0);
https://plnkr.co/edit/L38t3LYON9DszW5N2MjA?p=preview