You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在第一个事件触发后执行第二个事件,以touchmove后触发scroll为例

事件顺序触发解决方案

你要的 touchmove 结束后再响应 scroll 事件的需求可以通过 RxJS 操作符实现。你提供的现有代码存在语法错误:tap 操作符的回调函数缺少闭合括号,修正并优化后的实现如下:

fromEvent(window, 'touchmove').pipe(
  tap(() => this.scroll$.next(false)),
  debounceTime(100)
).subscribe(() => {
  this.scroll$.next(true);
})

逻辑说明

  • 每次 touchmove 触发时,立刻通过 this.scroll$.next(false) 禁用 scroll 相关逻辑
  • debounceTime(100) 实现防抖:当 touchmove 连续停止触发100ms后,才会执行 subscribe 内的逻辑,将 scroll 状态重新置为可用
  • 后续你只需要在 scroll 事件的回调中判断 this.scroll$ 的值为 true 时再执行业务逻辑即可

进阶实现(直接控制scroll事件流)

如果不想手动判断开关状态,可以直接通过 RxJS 操作符联动两个事件流,自动控制 scroll 事件的触发:

import { fromEvent, EMPTY } from 'rxjs';
import { switchMap, debounceTime, startWith, concatWith } from 'rxjs/operators';

// 定义原始scroll事件流
const originalScroll$ = fromEvent(window, 'scroll');

fromEvent(window, 'touchmove').pipe(
  // touchmove触发时,先停止响应scroll事件
  switchMap(() => EMPTY.pipe(
    // touchmove停止100ms后,重新恢复scroll事件的响应
    concatWith(originalScroll$.pipe(debounceTime(100)))
  )),
  // 初始状态默认响应scroll事件
  startWith(originalScroll$)
).subscribe(scrollEvent => {
  // 此处仅会在touchmove结束后拿到scroll事件,直接处理业务即可
  console.log('有效scroll事件', scrollEvent);
});

注意事项

  • 防抖时长可根据实际交互体验调整,移动端建议设置为50~150ms,避免出现明显的交互延迟
  • 如需更精准的触发时机,可以同时监听 touchend 事件配合防抖,避免用户滑动暂停但未松手的场景误触发scroll逻辑

内容的提问来源于stack exchange,提问作者baiju thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:15:04