Javascript 为什么每次setInterval执行一个周期时,它都会抛出所有周期的所有数据?
我在做一个Discord机器人,我有一个无限循环,每10秒有一个setInterval,但是setInterval做的每个循环,它给我每个循环的每个数据,所以我想知道如何才能只得到最后一个循环的最后一个数据,而不是每一个Javascript 为什么每次setInterval执行一个周期时,它都会抛出所有周期的所有数据?,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我在做一个Discord机器人,我有一个无限循环,每10秒有一个setInterval,但是setInterval做的每个循环,它给我每个循环的每个数据,所以我想知道如何才能只得到最后一个循环的最后一个数据,而不是每一个 const puppeteer = require('puppeteer'); const Discord = require('discord.js'); const client = new Discord.Client(); const url = 'url to scr
const puppeteer = require('puppeteer');
const Discord = require('discord.js');
const client = new Discord.Client();
const url = 'url to scrape';
var clocks = [];
(async () => {
const URL = url
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(URL, { 'waitUntil' : 'networkidle2' });
setInterval(async () => {
let clock = await page.evaluate(()=>{
var a = document.getElementById("task-listing-datatable").getAttribute("data-tasks");
var ar = eval(a);
var keyword = ['asdad', 'asdakdada', 'mama', 'Duplicate Fashion Product Identification Task'];
for(let i=0; i<ar.length; i++){
for(let j=0; j<keyword.length; j++){
if(ar[i][1] === keyword[j]){
let job = (`${ar[i][1]}`);
return (`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`);
}
}
}
});
console.log(`==== first login ====`)
console.log(`==================`)
if(!clocks.includes(clock)) {
client.on('message', (message)=>{
if(message.author.bot === false) {
message.channel.send(clock);
}
});
clocks.push(clock);
// Save the clock so you will remember it next time.
}
await page.reload();
}, 8000)
})()
client.login('discordjs token');
const puppeter=require('puppeter');
const Discord=require('Discord.js');
const client=new Discord.client();
const url='url to scrape';
变量时钟=[];
(异步()=>{
常量URL=URL
const browser=wait puppeter.launch()
const page=wait browser.newPage()
wait page.goto(URL,{'waitUntil':'networkidle2'});
setInterval(异步()=>{
让时钟=等待页面。评估(()=>{
var a=document.getElementById(“任务列表数据表”).getAttribute(“数据任务”);
var=评估值(a);
var关键字=['asdad'、'asdakdada'、'mama'、'重复时装产品识别任务'];
for(设i=0;i
正如你所看到的,现在它给出了每个变化,而不是每个周期的所有数据
每次运行setInterval
时,它都会重新加载页面,在“时钟”中收集信息,并通过discord发送。问题是,它不知道已经发送给您的是什么,因此每次都会收到一些相同的数据
解决方法是保存找到的数据,然后仅在当前批数据与以前的所有数据不同时创建不一致消息
因此,您需要某种类型的数据存储:
var clocks = [];
(async () => {
setInterval(async () => {
const URL = url
const browser = await puppeteer.launch()
// ...
一旦你把当前时钟取回来,你就要检查它是否不在数据存储中
if(!clocks.includes(clock)) {
如果不是,那么您知道您有一条新的数据要发送
if(!clocks.includes(clock)) {
client.on('message', (message)=>{
message.channel.send(clock);
});
clocks.push(clock); // Save the clock so you will remember it next time.
}
因此,总的来说,你有这样的东西:
var clocks = [];
(async () => {
setInterval(async () => {
const URL = url
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(URL, { 'waitUntil' : 'networkidle2' })
let clock = await page.evaluate(()=>{
var a = document.getElementById("task-listing-datatable").getAttribute("data-tasks");
var ar = eval(a);
var keyword = ['asdad', 'asdakdada', 'mama', 'What Is The Best Dialogue Category About Phones'];
for(let i=0; i<ar.length; i++){
for(let j=0; j<keyword.length; j++){
if(ar[i][1] === keyword[j]){
let job = (`${ar[i][1]}`);
return (`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`);
}
}
}
});
console.log(`==== first login ====`)
console.log(`==================`)
if(!clocks.includes(clock)) {
client.on('message', (message)=>{
message.channel.send(clock);
});
clocks.push(clock); // Save the clock so you will remember it next time.
}
await page.reload();
console.log(`after reload`)
}, 8000)
})()
现在,在page函数中,您可以访问旧的数据点
而不是
if(ar[i][1] === keyword[j]){
let job = (`${ar[i][1]}`); // What is this for?
return (`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`);
}
检查数据点是否存在于时钟阵列中,并且仅当它是新的时才返回它
if(ar[i][1] === keyword[j]){
let dataPoint =`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`;
if(!clocks.includes(dataPoint)){
return dataPoint;
}
}
每次运行setInterval
时,它都会重新加载页面,在“时钟”中收集信息,并通过discord发送。问题是,它不知道已经发送给您的内容,因此每次都会收到一些相同的数据
解决方法是保存找到的数据,然后仅在当前批数据与以前的所有数据不同时创建不一致消息
因此,您需要某种类型的数据存储:
var clocks = [];
(async () => {
setInterval(async () => {
const URL = url
const browser = await puppeteer.launch()
// ...
一旦你把当前时钟取回来,你就要检查它是否不在数据存储中
if(!clocks.includes(clock)) {
如果不是,那么您知道您有一条新的数据要发送
if(!clocks.includes(clock)) {
client.on('message', (message)=>{
message.channel.send(clock);
});
clocks.push(clock); // Save the clock so you will remember it next time.
}
因此,总的来说,你有这样的东西:
var clocks = [];
(async () => {
setInterval(async () => {
const URL = url
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto(URL, { 'waitUntil' : 'networkidle2' })
let clock = await page.evaluate(()=>{
var a = document.getElementById("task-listing-datatable").getAttribute("data-tasks");
var ar = eval(a);
var keyword = ['asdad', 'asdakdada', 'mama', 'What Is The Best Dialogue Category About Phones'];
for(let i=0; i<ar.length; i++){
for(let j=0; j<keyword.length; j++){
if(ar[i][1] === keyword[j]){
let job = (`${ar[i][1]}`);
return (`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`);
}
}
}
});
console.log(`==== first login ====`)
console.log(`==================`)
if(!clocks.includes(clock)) {
client.on('message', (message)=>{
message.channel.send(clock);
});
clocks.push(clock); // Save the clock so you will remember it next time.
}
await page.reload();
console.log(`after reload`)
}, 8000)
})()
现在,在page函数中,您可以访问旧的数据点
而不是
if(ar[i][1] === keyword[j]){
let job = (`${ar[i][1]}`); // What is this for?
return (`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`);
}
检查数据点是否存在于时钟阵列中,并且仅当它是新的时才返回它
if(ar[i][1] === keyword[j]){
let dataPoint =`${ar[i][0]} ${ar[i][1]} Paga ${ar[i][3]} Tareas: ${ar[i][5]}`;
if(!clocks.includes(dataPoint)){
return dataPoint;
}
}
我复制并运行了你给我的代码,但我仍然有问题,我不知道为什么,我使用间隔只是因为我需要刷新页面以获取新数据。你的其余代码是什么样子的?你能更新你的原始帖子以显示完整的上下文吗?看看我所做的编辑,看看这是否为你提供了正确的方向。t要点是你的页面功能(时钟)每次都将获得相同的数据,因为它查找第一个匹配项,然后立即返回。我复制并运行了您给我的代码,但仍然存在问题,我不知道为什么,我使用间隔只是因为我需要刷新页面以获取新数据。您的其余代码是什么样子的?您可以更新您的ori吗ginal post是否要显示完整的上下文?请看我所做的编辑,看看这是否为您提供了正确的方向。要点是,您的页面函数(时钟)每次都将获得相同的数据,因为它查找第一个匹配项,然后立即返回。