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
相关产品推荐
相关产品推荐

