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