改变流数据的debounceTime

时间:2016-11-02 20:04:03

标签: rxjs rxjs5

让我难过的愚蠢问题。我想根据流中的数据给出不同的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,则延迟按预期工作。我显然错过了两个运营商之间的基本面。我已经完成了文档而没有得到它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我无法使用您的实际用例对此进行测试,但您未正确使用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