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

Telegraf.js能否监听场景离开事件?Nest.js场景调用疑问

问题解答

1. 能否在进入场景的位置处理场景离开事件?

完全可以,有几种实用的实现方式:

  • 监听场景实例的leave事件:调用ctx.scene.enter()获取场景实例后,直接绑定leave事件监听器,场景离开时自动触发处理逻辑:

    const scene = await ctx.scene.enter('scene-id');
    scene.on('leave', () => {
      // 在这里编写场景离开后的处理逻辑
      console.log('目标场景已退出');
    });
    
  • 在场景定义时预留钩子:如果场景服务是你自定义的,可以在场景类中添加回调设置方法,让启动服务在进入场景时传入离开处理逻辑:

    // 场景服务中的场景类
    export class TargetScene {
      private onLeaveHandler?: () => void;
    
      setOnLeaveHandler(handler: () => void) {
        this.onLeaveHandler = handler;
      }
    
      // 场景内部触发退出时调用此方法
      triggerLeave() {
        this.onLeaveHandler?.();
      }
    }
    
    // 启动服务中的调用逻辑
    const scene = await ctx.scene.enter('scene-id');
    (scene as TargetScene).setOnLeaveHandler(() => {
      // 执行离开后的处理逻辑
    });
    

2. 如何让ctx.scene.enter('scene-id')等待场景离开完成?

ctx.scene.enter()默认仅完成场景进入流程,不会等待场景结束。你可以自行封装一个Promise,通过监听场景的leave事件来实现等待:

async function enterSceneAndWaitForLeave(ctx: Context, sceneId: string) {
  const scene = await ctx.scene.enter(sceneId);
  return new Promise<void>((resolve) => {
    // 使用once避免重复触发
    scene.once('leave', resolve);
  });
}

// 调用示例
await enterSceneAndWaitForLeave(ctx, 'scene-id');
// 此处代码会等待场景退出后才继续执行

如果需要获取场景离开时的额外数据,也可以在resolve时传递对应参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:32:32