我想对流进行去抖动-但前提是源值与以前相同。我将如何使用RxJS 5做到这一点?

如果值相同并且我之前在指定的时间范围内发出了该值,则我不想发出该值。我应该能够使用流中的值-或比较类似于distinctUntilChanged的函数。

最佳答案

我不知道没有创建自己的运算符的任何方法,因为您需要维护某种状态(最后看到的值)。

一种方式如下所示:

// I named this debounceDistinctUntilChanged but that might not be
// the best name. Name it whatever you think makes sense!

function debounceDistinctUntilChanged(delay) {
  const source$ = this;

  return new Observable(observer => {
    // Using an object as the default value
    // so that the first time we check it
    // if its the same its guaranteed to be false
    // because every object has a different identity.
    // Can't use null or undefined because source may
    // emit these!
    let lastSeen = {};

    return source$
      .debounce(value => {
        // If the last value has the same identity we'll
        // actually debounce
        if (value === lastSeen) {
          return Observable.timer(delay);
        } else {
          lastSeen = value;
          // This will complete() right away so we don't actually debounce/buffer
          // it at all
          return Observable.empty();
        }
      })
      .subscribe(observer);
  });
}

现在您看到了一个实现,您可能会(或可能不会)发现它与您的期望有所不同。您的描述实际上遗漏了某些详细信息,例如,如果该值仅应是在去抖动时间范围内保留的最后一个值,或者它是一个集合(基本上是distinctUntilChangeddistinct)。我以为以后。

希望这两种方式都可以为您提供一个起点,并揭示创建自定义运算符的难易程度。内置的运算符绝对不能按原样提供所有解决方案,因此任何足够高级的应用程序都需要自己制作(或在不抽象的情况下内联执行命令性的东西,这也很好)。

然后,可以通过将其放在Observable原型(prototype)上来使用此运算符:
Observable.prototype.debounceDistinctUntilChanged = debounceDistinctUntilChanged;

// later
source$
  .debounceDistinctUntilChanged(400)
  .subscribe(d => console.log(d));

或使用let:
// later
source$
  .let(source$ => debounceDistinctUntilChanged.call($source, 400))
  .subscribe(d => console.log(d));

如果可以的话,我建议您真正了解我的代码的作用,以便将来您可以轻松地制定自己的解决方案。

10-06 10:59