Discord JS bot 如何从 API 获取递归异步函数
Posted
技术标签:
【中文标题】Discord JS bot 如何从 API 获取递归异步函数【英文标题】:Discord JS bot how to make a recursive async function fetching from API 【发布时间】:2021-12-23 21:41:54 【问题描述】:我正在尝试制作一个不和谐的机器人。我希望它每 X 秒获取一次 API 并检查创建的新主题。
API JSON 仅包含一个对象,即网站上的最新帖子。我希望机器人每 X 秒获取一次,并且如果找到的最新帖子具有更大的 uid 以在频道中发送消息。如果不是什么都不做。 uid 是一个数字。
尝试使用 setInterval 函数,但无法使其工作,因为它给出了等待需要在***异步函数中的错误。
我还硬编码了最新的帖子 uid“latest_post”,我看到它工作的方式是,如果来自 API 的 post_id 高于硬编码的,然后硬编码的一个接收新的值。然而,latest_post 的值保持不变,因为函数再次执行并且 lates_post 每次都被硬编码。试图在函数外部声明它,但结果是未定义的。
这是我目前的几乎可以工作代码
client.on('messageCreate', async (message) =>
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
if (command === 'new')
var latest_post = 12345; // hardcoded latest post uid
try
const response = await fetch('API HERE').then(r => r.text());
const body = JSON.parse(response);
const obj = body.data;
const objId = obj[0].post_id;
const objAuthor = obj[0].author;
const objTitle = obj[0].title;
if (objTopic > latest_post)
client.channels.cache.get("CHANNEL ID").send(`Found a new post by $objAuthor`);
var latest_post = objId; // if it fetches a post with a higher uid then latest_post receives the value of that higher uid
else
var d = new Date();
var n = d.toLocaleTimeString();
console.log(`No new posts yet at $n`); //logs "No new posts yet at 1:30 PM"
catch (error)
message.channel.send('Oops, there was an error fetching the API');
console.log(error);
);
谁能指导我如何将其转换为每 X 秒自动运行的递归函数。 谢谢!
【问题讨论】:
你可以尝试使用现有的库 socket io 来轮询 nodejs 或类似的东西I want it to fetch an API every X seconds
- 我不会推荐它。这可能会让您受到限速。我确信有一种方法可以在不不断获取的情况下聆听它
我认识 API 专家,所以 ratelimit 应该不是问题。不过感谢您的提醒:)
【参考方案1】:
经过一些迭代后,它以我想要的方式工作。将代码留在下面,希望对您有所帮助!
let refreshint = 10 * 1000; //10 seconds
var API = "API_HERE";
client.on('ready', async (message) =>
console.log('Bot is connected...');
var latest_post = 12345 // hardcoded latest post uid
setInterval(async function()
try
const response = await fetch('API').then(r => r.text());
const body = JSON.parse(response);
const obj = body.data;
const objId = obj[0].post_id;
const objAuthor = obj[0].author;
const objTitle = obj[0].title;
if (objTopic > latest_post)
client.channels.cache.get("CHANNEL ID").send(`Found a new post by $objAuthor`);
console.log(`Found a new post by $objAuthor`);
function change_value(latest_post)
return latest_post;
latest_post = change_value(topicId);
else
var d = new Date();
var n = d.toLocaleTimeString();
console.log(`No new thread yet at $n`);
catch (error)
message.channels.cache.get('channel ID here').send('Oops, there was an error fetching the API');
console.log(error);
, refreshint) );
【讨论】:
以上是关于Discord JS bot 如何从 API 获取递归异步函数的主要内容,如果未能解决你的问题,请参考以下文章
Discord bot 无法访问 Google Sheets 获取错误请求缺少有效的 API 密钥
从 discord.js 中的消息中获取 Emoji url
从数组中获取项目并将其删除,直到 Discord JS bot 的数组为空