Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么每次setInterval执行一个周期时,它都会抛出所有周期的所有数据?_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript 为什么每次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

我在做一个Discord机器人,我有一个无限循环,每10秒有一个setInterval,但是setInterval做的每个循环,它给我每个循环的每个数据,所以我想知道如何才能只得到最后一个循环的最后一个数据,而不是每一个

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是否要显示完整的上下文?请看我所做的编辑,看看这是否为您提供了正确的方向。要点是,您的页面函数(时钟)每次都将获得相同的数据,因为它查找第一个匹配项,然后立即返回。