改变流数据的 debounceTime
Alter debounceTime on stream data
让我难过的愚蠢问题。我想根据流中的数据提供不同的 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
上面的代码只是 returns x 没有去抖动。但是,如果我用 delay 替换 debounceTime,则延迟会按预期工作。我显然遗漏了两个运营商之间的一些基本知识。我已经浏览了文档,但还是没明白。
感谢您的帮助!
我无法用您的实际用例对此进行测试,但您没有正确使用 debounceTime
。
Operator debounceTime
仅对这个 Observable 流及其数据应用去抖动。由于您将 concatMap
和返回的 Observable 与 debounceTime
链接在一起,concat 将始终等待 Observable 完成。所以这总是 returns 所有三个值。
您可以使用 debounce()
来期望获得一个 Observable,该 Observable 允许您通过发射值而不是硬编码时间来使用延迟。
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))
);
让我难过的愚蠢问题。我想根据流中的数据提供不同的 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
上面的代码只是 returns x 没有去抖动。但是,如果我用 delay 替换 debounceTime,则延迟会按预期工作。我显然遗漏了两个运营商之间的一些基本知识。我已经浏览了文档,但还是没明白。
感谢您的帮助!
我无法用您的实际用例对此进行测试,但您没有正确使用 debounceTime
。
Operator debounceTime
仅对这个 Observable 流及其数据应用去抖动。由于您将 concatMap
和返回的 Observable 与 debounceTime
链接在一起,concat 将始终等待 Observable 完成。所以这总是 returns 所有三个值。
您可以使用 debounce()
来期望获得一个 Observable,该 Observable 允许您通过发射值而不是硬编码时间来使用延迟。
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))
);