如何延长Discord机器人的输入状态提示时长?
解决Discord.js中sendTyping()时长限制问题
问题原因
你代码里的核心问题是:awaitTypingState是sendTyping()执行后的Promise结果,不是可重复调用的函数。定时器里只写awaitTypingState;根本不会重新触发输入状态请求,自然只会执行一次。
修正方案
1. 正确设置重复触发的定时器
要每次在定时器里重新调用message.channel.sendTyping(),而不是复用之前的变量:
// 先触发第一次输入状态 await message.channel.sendTyping(); // 每5秒重复调用sendTyping(),维持输入状态 const typingInterval = setInterval(async () => { await message.channel.sendTyping(); }, 5000);
Discord的sendTyping()会维持10秒输入状态,设5秒间隔能避免出现状态空档。
2. 及时清理定时器
你原来用setTimeout(50000)清理定时器的逻辑不合理,应该在API请求完成后立即清除,不管成功还是失败:
// 示例API请求逻辑 try { const response = await yourApiRequestFunction(); // 请求成功,立即停止输入状态 clearInterval(typingInterval); await message.channel.send(response.data); } catch (err) { // 请求失败,也要停止输入状态 clearInterval(typingInterval); await message.channel.send('请求出错了,请稍后再试'); }
完整示例代码
async function handleCommand(message) { try { // 初始化输入状态 await message.channel.sendTyping(); // 设置重复触发的定时器 const typingInterval = setInterval(async () => { await message.channel.sendTyping(); }, 5000); // 模拟耗时15秒的API请求 const response = await new Promise(resolve => { setTimeout(() => resolve({ data: 'API请求结果' }), 15000); }); // 请求完成,清理定时器并发送结果 clearInterval(typingInterval); await message.channel.send(response.data); } catch (error) { // 处理错误,确保定时器被清理 if (typeof typingInterval !== 'undefined') { clearInterval(typingInterval); } await message.channel.send('处理请求时发生错误'); } }
内容的提问来源于stack exchange,提问作者thump
相关产品推荐
相关产品推荐

