Rxjs 改变流数据上的去BounceTime

Rxjs 改变流数据上的去BounceTime,rxjs,rxjs5,Rxjs,Rxjs5,这个愚蠢的问题把我难住了。我想根据流中的数据给出不同的去BounceTime。我有: 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$ .co

这个愚蠢的问题把我难住了。我想根据流中的数据给出不同的去BounceTime。我有:

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 |

上面的代码只返回x,不带去盎司。但是如果我用延迟来代替去BounceTime,那么延迟就像预期的那样工作。很明显,我在两个操作符之间遗漏了一些基本的东西。我已经看过文件了,现在还没拿到


谢谢你的帮助

我无法用您的实际用例测试这一点,但您没有正确使用
debounceTime

操作员
debounceTime
仅对该可观察流及其数据应用去盎司。由于您正在链接
concatMap
,并使用
debounceTime
返回可观察对象,concat将始终等待可观察对象完成。所以它总是返回所有三个值

您可以使用
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));
见现场演示:

这只会发出:
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))
);

如果将
debounceTime
替换为
delay
,它仍然会返回所有三个数字,而不仅仅是
3
,感谢您向我展示了我的错误方法,并解释了它不起作用的原因。有道理。您的解决方案非常有效。谢谢你的时间和帮助!