如果发出相同的可观察值,则取消延迟

1 javascript observable rxjs

const observable = new rxjs.BehaviorSubject(0);

observable.subscribe(v => console.log(v));

rxjs
  .of(1)
  .pipe(rxjs.operators.delay(500))
  .subscribe(v => observable.next(v));
  
observable.next(2);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,上面的 observable 按顺序发出 3 个值:0、2、1。

当发出值“2”时是否可以取消(或忽略)值“1”?(无需关闭订阅)

kos*_*kos 6

看来你需要switchMap从你的来源开始并应用delay它的内部。

switchMap(value =>
 of(value).pipe(delay(50))
)
Run Code Online (Sandbox Code Playgroud)

带延迟的 switchMap 的插图和游乐场:

使用 switchMap 延迟

这是一个片段:

switchMap(value =>
 of(value).pipe(delay(50))
)
Run Code Online (Sandbox Code Playgroud)
const {Subject, of} = rxjs;
const {switchMap, delay} = rxjs.operators;

const subject = new Subject(0);

subject
  .pipe(
     switchMap(value =>
       // switchMap to a delayed value
       of(value).pipe(delay(500))
     )
  )
  .subscribe(v => console.log(v));

// immediately emit 0
subject.next(0);

// emit 1 in 1 sec
setTimeout(()=>{
  subject.next(1);
}, 1000)

// emit 2 in 1.2 sec
setTimeout(()=>{
  subject.next(2);
}, 1200)
Run Code Online (Sandbox Code Playgroud)

这是一个鼠标悬停的例子

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>
Run Code Online (Sandbox Code Playgroud)
const {fromEvent, merge, of, EMPTY} = rxjs;
const {switchMap, delay, mapTo} = rxjs.operators;

const button = document.getElementById('pane');
const mouseOver$ = fromEvent(button, 'mouseover').pipe(
  mapTo(true)
);

const mouseOut$ = fromEvent(button, 'mouseout').pipe(
  mapTo(false)
);

merge(mouseOver$, mouseOut$)
  .pipe(
     switchMap(value => {
       if (!value) { return EMPTY; }
       return of('mouse is over').pipe(delay(500))
     })
  )
  .subscribe(v => console.log(v));
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助