javascript – RxJS:仅在不同的情况下对流进行去抖动

我想去除一个流 – 但前提是源值与以前相同.我如何用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);
  });
}

现在您看到了一个实现,您可能(或可能不会)发现它与您的期望不同.你的描述实际上遗漏了某些细节,比如它应该只是你在去抖时间范围内保留的最后一个值,或者它是否是一组 – 基本上是distinctUntilChanged与distinct不同.我假设后者.

无论哪种方式,这有望为您提供一个起点,并揭示创建自定义运算符是多么容易.内置运算符绝对不能为所有内容提供解决方案,因此任何足够先进的应用程序都需要自己创建(或者在不抽象的情况下内联强制执行内容,这也很好).

然后,您可以将此运算符放在Observable原型上:

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));

如果可以,我建议您真正了解我的代码所做的事情,以便将来您能够轻松制作自己的解决方案.

上一篇:javascript – 是否可以使用rxjs angular 5在其他标签浏览器中订阅observable


下一篇:javascript – 如何在RxJS中实现时间到期热观察(或在Reactive Extensions中一般)