javascript - 如何让 node.js webscraper 定期检查端点的数据更新?
问题描述
我正在编写一个从第三方 API 聚合数据的不和谐机器人。
对于我的网络抓取功能,我想遵循一种设计模式discord.js
,其中一个实例化客户端对象,并在客户端发出特定事件时执行操作,如下所示:
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
.
我不知道这些功能是如何实现的。更具体地说,我无法弄清楚 discordclient
对象如何不断地寻找变化,并在它注意到它们时发出一个事件。
我想模仿这种设计模式的原因是,我可以运行一个 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();
解决方案
这部分代码
while (true) {
setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}
创建无限量的超时。您需要做的只是在前一个完成后才开始超时。一个例子是:
function loop() {
setTimeout(loop, 1500);
}
这会在 1500 秒后调用该函数,而后者又会在 1500 秒后调用该函数,依此类推。
但是,更好的解决方案是使用setInterval()
. 它看起来像这样:
function loop() {};
setInterval(loop, 1500);
所以,而不是写
while (true) {
setTimeout(() => scrapeEmitter.emit("timeExpired"), 1500);
}
写
setInterval(() => scrapeEmitter.emit("timeExpired"), 1500);
这消除了无限循环并按预期运行。
我只是将@Worthy Alpaca 的回答翻译成评论。这是一个社区维基,所以我没有声誉
推荐阅读
- javascript - 一旦使用javascript单击第一个对话框的按钮,我想显示另一个具有相同样式的对话框
- docker - Docker-compose - 高效开发
- r - lapply 和 sapply 函数可以用在具有不同 R 基函数的矩阵或数据帧上吗?
- linux - 是否可以在外部数据文件操作命令中使用 gnuplot 变量?
- sql - SQL 日期逻辑 - 查找之前的*非标准*季度
- postgresql - Azure 数据工厂通过 SSH 连接到 AWS RDS PostgresSQL
- spring - 在具有远程分区的并发春季批处理作业期间,工人回复中的消息交叉
- android - 具有 PIN 身份验证的 Android BLE 外设(GATT 服务器)
- r - read_excel() 函数在 Rmarkdown 中不起作用
- azure - 从服务主体和基于秘密的登录方法生成的令牌无效