首页 > 解决方案 > 无法让 javascript node.js 每 1.5 秒运行一次 setTimeout

问题描述

我有一个在 node.js 中运行的简单 javascript 文件。我只是想让循环每 1.5 秒运行一次。我正在使用 setTimeout (考虑使用睡眠)但无法让它运行。

for (let [key, value] of Object.entries(rows)) {我正在尝试为位于下面代码中的 for 循环设置延迟。

查询运行,但是,它从不遵守我指定的 1.5 秒延迟。

提前谢谢了。

const fs = require('fs');
const papa = require('papaparse');
const axios = require('axios');
const apiKey = 'mySecret'

// console.log(papa);
let data = undefined;
const file = './FileWithColumnData.csv';
let content = fs.readFileSync(file, 'utf8');
let rows;

papa.parse(content, {
  header: true,
  delimiter: ',',
  complete: function(results) {
    rows = results.data

    usingFile = 'results.csv'
    if(fs.existsSync(usingFile)) {
      fs.unlinkSync(usingFile)    
    }
    
    const headerRow = 'Account Number,Name,Primary Street,Primary City,Primary State,Primary ZIP Code,District Number\n';
    fs.appendFileSync(usingFile, headerRow);

    for (let [key, value] of Object.entries(rows)) {
      setTimeout(function () {
        let newLine = '';
        let districtNumber = ''
        const address = value['Primary Street'] + ' ' + value['Primary City'] + ', ' + value['Primary State'] + ' ' + value['Primary ZIP Code']
        const addressEncoded = encodeURI(address)
        const axiosUrl = 'https://www.googleapis.com/civicinfo/v2/representatives?key=' + apiKey + '&address=' + addressEncoded

        axios.get(axiosUrl)
          .then((res) => {
            let _this = this
            const offices = res.data.offices;
            for (let [key2, value2] of Object.entries(offices)) {
              if (value2['name'] === 'Cook County Commissioner') {
                
                const districtVal = value2['divisionId']
                
                districtNumber =  districtVal.length == 63 ? districtVal.slice(-1) : districtVal.slice(-2)
                
                newLine = value['Name'] + ',' + value['Primary Street'] + ',' + value['Primary City'] + ',' + value['Primary State'] + ',' + value['Primary ZIP Code'] + ',' + districtNumber + '\n'
                fs.appendFileSync(usingFile, newLine);
              }
            }
          })
          .catch(function (error) {
            // handle error
            newLine = value['Name'] + ',' + value['Primary Street'] + ',' + value['Primary City'] + ',' + value['Primary State'] + ',' + value['Primary ZIP Code'] + ',Not Found\n'
            fs.appendFileSync(usingFile, newLine);
          })

      }, 1500);
    }
  }
});

标签: javascriptnode.jssettimeout

解决方案


你真的需要学习如何使用async/await并完全放弃.then()语法,它会让你的生活变得更轻松:)

const papa = require('papaparse');
const axios = require('axios');
const apiKey = 'mySecret'

import { promises } from "fs";

const file = './FileWithColumnData.csv';
let content = fs.readFileSync(file, 'utf8');
let rows;

const complete = async (results) => {
    rows = results.data;

    usingFile = 'results.csv'

    if (await promises.exists(usingFile)) {
        await promises.unlink(usingFile);
    }

    const headerRow = 'Account Number,Name,Primary Street,Primary City,Primary State,Primary ZIP Code,District Number\n';
    await appendFile(usingFile, headerRow);

    for (let [key, value] of Object.entries(rows)) {

        await new Promise(r => setTimeout(r, 1500));

        let newLine = '';
        let districtNumber = '';
        const address = value['Primary Street'] + ' ' + value['Primary City'] + ', ' + value['Primary State'] + ' ' + value['Primary ZIP Code'];
        const addressEncoded = encodeURI(address);
        const axiosUrl = 'https://www.googleapis.com/civicinfo/v2/representatives?key=' + apiKey + '&address=' + addressEncoded;

        try {
            const res = await axios.get(axiosUrl);
        } catch (error) {
            // handle error
            newLine = value['Name'] + ',' + value['Primary Street'] + ',' + value['Primary City'] + ',' + value['Primary State'] + ',' + value['Primary ZIP Code'] + ',Not Found\n'
            await appendFile(usingFile, newLine);
            continue;
        }

        const offices = res.data.offices;

        for (let [key2, value2] of Object.entries(offices)) {
            if (value2['name'] === 'Cook County Commissioner') {

                const districtVal = value2['divisionId']

                districtNumber = districtVal.length == 63 ? districtVal.slice(-1) : districtVal.slice(-2)

                newLine = value['Name'] + ',' + value['Primary Street'] + ',' + value['Primary City'] + ',' + value['Primary State'] + ',' + value['Primary ZIP Code'] + ',' + districtNumber + '\n'
                await fs.appendFile(usingFile, newLine);
            }
        }
    }
}

papa.parse(content, {
    header: true,
    delimiter: ',',
    complete
});

推荐阅读