愚蠢的问题让我难住了。我想根据流中的数据给出不同的 debounceTime。我有:

const fakeData = [{number: 1}, {number: 2}, {number: 3}];
const stream$ = Rx.Observable.from(fakeData);
const delayedStream$ = stream$.concatMap(x => Rx.Observable.of(x).delay(300));

delayedStream$
  .concatMap(x => x.number >=2
      ? Rx.Observable.of(x).debounceTime(500)
      : Rx.Observable.of(x).debounceTime(1000)
   )
  .subscribe(x => console.log(x));
// expected output: 3
// actual output:  1 ... 2 ... 3 |

http://jsbin.com/dafaxoraca/edit?js,console

上面的代码只是简单地返回 x 而没有去抖动。但是如果我用延迟替换 debounceTime,延迟会按预期工作。我显然错过了两个运营商之间的一些基本内容。我已经浏览了文档,但没有得到它。

谢谢你的帮助!

最佳答案

我无法用您的实际用例对此进行测试,但您没有正确使用 debounceTime

运算符 debounceTime 仅在此 Observable 流及其数据上应用去抖动。由于您使用 concatMap 链接 debounceTime 和返回的 Observable,concat 将始终等待 Observable 完成。所以这总是返回所有三个值。

您可以使用期望获得 Observable 的 debounce() ,它允许您通过发出值而不是硬编码时间来使用延迟。

const fakeData = [{number: 1}, {number: 2}, {number: 3}];
const stream$ = Rx.Observable.from(fakeData);
const delayedStream$ = stream$.concatMap(x => Rx.Observable.of(x).delay(300));

delayedStream$
    .debounce(val => Rx.Observable.of(true).delay(val >= 2 ? 500 : 1000))
    .subscribe(x => console.log(x.number));

观看现场演示:http://jsbin.com/tifajodogi/1/edit?js,console

这仅发出:3
更新:从 RxJS 5.5+ 开始,同样的技术可以像这样重构:
const fakeData = [{number: 1}, {number: 2}, {number: 3}];
const stream$ = from(fakeData);
const delayedStream$ = stream$.pipe(concatMap(x => of(x).pipe(delay(300))));

delayedStream$.pipe(
  debounce(val => of(true).pipe(delay(val >= 2 ? 500 : 1000)))
  subscribe(x => console.log(x.number))
);

关于rxjs - 更改流数据的 debounceTime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40388785/

10-12 03:56