【发布时间】:2020-10-21 17:55:32
【问题描述】:
我正在编写一个从第三方 API 聚合数据的不和谐机器人。
discord.js 有一个设计模式,我想为我的网络抓取功能遵循它,其中一个实例化客户端对象,并在客户端发出特定事件时执行操作,like so:
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('Pong!');
}
});
client.login('token');
据我了解,此代码将无限期运行,每次发出特定事件时执行操作,例如ready 或 message。
我不知道这些功能是如何实现的。更具体地说,我无法弄清楚 discord client 对象如何不断地寻找变化,并在注意到它们时发出一个事件。
我想模拟这种设计模式的原因是我可以运行一个 node.js 应用程序,它会每隔 10 分钟访问 API 并查看是否有新信息,并将其记录到数据库中当有变化时。
我最初的想法是这样的,但它会因内存不足错误而炸毁调用堆栈。
const events = require("events");
class ScrapeEmitter extends events.EventEmitter {}
const scrapeEmitter = new ScrapeEmitter();
scrapeEmitter.on("timeExpired", () => console.log("call scraping code here"));
while (true) {
setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}
最终目标是从 index.js 编写以下内容,并让它既监听不和谐事件,又抓取数据。
import * as scraper from "./core/scraper";
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', msg => {
if (msg.content === 'ping') {
msg.reply('Pong!');
}
});
client.login('token');
scraper.begin_scraping();
【问题讨论】:
-
您可以使用
setInterval代替setTimeout并离开while循环。 -
我认为它应该是这样工作的,谢谢!
标签: javascript node.js events web-scraping emit