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

如何延长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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:00:00