[英]How to make a node.js webscraper periodically check an endpoint for data updates?
我正在編寫一個不和諧的機器人,它聚合來自第三方 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
。
我不知道如何實現這樣的功能。 更具體地說,我無法弄清楚 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();
這部分代碼
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 的回答翻譯成評論。 這是一個社區維基,所以我沒有聲譽
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.