rxjs наблюдаемый debounceTime inner next игнорируется - PullRequest
0 голосов
/ 24 апреля 2018

Кажется, что debounceTime игнорирует внутренние вызовы своих субъектов next метод:

var subject: Subject<number> = new Subject<number>();

subject.pipe(
    tap((a) => console.log("tab:" + a)), 
    debounceTime(300), 
).subscribe((a) => {
    console.log(a);
    subject.next(100)
});

subject.next(19);
subject.next(20);

приведенный выше код должен создавать бесконечный цикл - но это не так:

tab:19
tab:20
20
tab:100

если я добавлю delay(1) к трубе, она будет работать как положено:

subject.pipe(
    tap((a) => console.log("tab:" + a)), 
    debounceTime(300), 
    delay(1)
).subscribe((a) => {
    console.log(a);
    subject.next(100)
});

я что-то упустил?

Редактировать : добавлен пример: https://typescript -fbt2mn.stackblitz.io

1 Ответ

0 голосов
/ 24 апреля 2018

Этот тип проблем, когда кажется, что что-то сломано и может быть волшебным образом исправлено с помощью delay(0) или setTimeout, обычно означает, что вы ожидаете, что RxJS будет вести себя асинхронно все время, хотя на самом деле он обычно работает синхронно, если только вынужден поступить иначе.

И это точно ваш случай.

Кстати, немного более элегантным способом является использование оператора observeOn с планировщиком async, который должен быть более эффективным, чем delay(1).

import { async } from 'rxjs/scheduler/async';

var obs = Observable.of(1, 2, 3);
var subject: Subject<number> = new Subject<number>();

subject.pipe(
    tap((a) => console.log("tab:" + a)), 
    debounceTime(300),
    observeOn(async),
).subscribe((a) => {
    console.log(a);
    subject.next(a+1)
});

Увидимся обновленные демо: https://stackblitz.com/edit/typescript-tsek9s?file=index.ts

Редактировать: Это поведение, вероятно, изменилось в RxJS 6: https://github.com/ReactiveX/rxjs/pull/3218

...