以下为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
.....