以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
72. 实现Observable interval()
解题思路:
题目要求我们实现一个 creation operator interval()
,它会创建一个 Observable,每隔一定时间就会产生一个新的 value,然后把这个 value 发射给 Subscriber。
为了实现这个 operator,我们可以利用 Observable.create()
来创建一个 Observable,然后再利用 setInterval()
来定时产生 value。
具体实现:
function interval(period) {
return Observable.create(function(observer) {
let n = 0;
const intervalId = setInterval(() => {
observer.next(n++);
}, period);
return function() {
clearInterval(intervalId);
}
});
}
我们通过 Observable.create()
创建一个 Observable,传入一个函数,这个函数会接收一个 observer 参数。
然后,我们在函数中利用 setInterval()
定时产生 value,并通过 observer.next()
发射给 Subscriber。
最后,我们还需要返回一个函数,它会在 Observable 被取消订阅时执行,我们可以利用 clearInterval()
来清理定时器。
完整代码如下:
function Observable(subscribe) {
this._subscribe = subscribe;
}
Observable.prototype.subscribe = function(observer) {
const subscription = new Subscription();
this._subscribe({
...observer,
subscription
});
return subscription;
}
Observable.create = function(subscribe) {
return new Observable(subscribe);
}
function Subscription() {
this.unsubscribe = function() {}
}
Subscription.prototype.add = function(sub) {
const originalUnsubscribe = this.unsubscribe;
this.unsubscribe = function() {
sub.unsubscribe();
originalUnsubscribe.call(this);
}
}
Subscription.create = function(unsubscribe) {
const subscription = new Subscription();
subscription.unsubscribe = unsubscribe;
return subscription;
}
function interval(period) {
return Observable.create(function(observer) {
let n = 0;
const intervalId = setInterval(() => {
observer.next(n++);
}, period);
return function() {
clearInterval(intervalId);
}
});
}
测试代码:
interval(1000).subscribe(console.log);
运行结果:
0
1
2
3
4
5
6
.....