【问题标题】:Make a loop wait for 2 seconds after fetching every 5 pages在每 5 页获取后循环等待 2 秒
【发布时间】:2022-02-08 10:48:12
【问题描述】:

我希望脚本调用在每 5 页后等待 2 秒。

我的要求是for 循环应该在pageData.Number 到达第5 页时等待2 秒。所以基本上,循环应该在每5 页后等待2 秒。

不知道如何检查页面是否到达第5页并等待2秒。

for (var i = 1; i <= pageData.Number; i++) {
  var pageRequest = $.getJSON(URL, function (data) {
    if (i % 5 == 0) {
      sleep(5000);
    }
    /* .... */
  }).fail(function () {
    errorPage.push(i);
  });
}

// from https://www.sitepoint.com/delay-sleep-pause-wait/
function sleep(milliseconds) {
  const date = Date.now();
  let currentDate = null;
  do {
    currentDate = Date.now();
  } while (currentDate - date < milliseconds);
}

【问题讨论】:

    标签: javascript jquery ajax wait sleep


    【解决方案1】:

    您可以这样做 - 使用 async/await 和不使用 jQuery。

    /**
     * @summary waits a specified number of seconds
     * @param {number} [seconds] seconds to wait
     * @returns {Promise<void>}
     * @link https://github.com/samliew/se-electionbot/blob/master/src/bot/utils.js#L910
     */
    const wait = (seconds = 1) => new Promise((r) => setTimeout(r, seconds * 1e3));
    
    /**
     * Your main function, async
     */
    (async function () {
      
      const errorPage = [];
      const pageData = {
        Number: 10,
      };
    
      // Test URL
      const url = 'https://reqbin.com/echo/get/json';
      
      for (let i = 1; i <= pageData.Number; i++) {
      
        // Fetch url
        const data = await fetch(url).then(response =>
          // Convert data to json, or return null on error
          response.ok ? response.json() : errorPage.push(i) && null
        );
        
        // Data exists
        if(data) {
            // Do something with data
            console.log(`Request ${i} completed.`);
        }
    
        // Short wait after every fifth request
        if (i % 5 === 0) {
          console.log('Waiting for 2 seconds...');
          await wait(2);
        }
      }
    
      console.log('Done!');
    })();

    【讨论】:

      【解决方案2】:

      我认为你需要这样的东西。它使用 javascript remainder operator 和自定义睡眠功能。

      for (var i = 1; i <= pageData.Number; i++) {
        //setTimeout(func, 2000);              
        var pageURL = Url + "?startDate=" + moment(startDate).format(dateFormat) + "&endDate=" + moment(endDate).add(1, 'day').format(dateFormat) + "&pageNumber=" + i;               
        var pageRequest = $.getJSON(URL, function (data) {
        if (i % 5 == 0) {
          sleep(2000);
        }
      }
      
      // from https://www.sitepoint.com/delay-sleep-pause-wait/
      function sleep(milliseconds) {
        const date = Date.now();
        let currentDate = null;
        do {
          currentDate = Date.now();
        } while (currentDate - date < milliseconds);
      }

      【讨论】:

      • 我按照你的方式添加了。但这对我不起作用。请看上面的代码。
      猜你喜欢
      • 1970-01-01
      • 2017-05-30
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多