nodejs使用request包在while循环里发送get请求遇到的问题

本人想要实现的功能是每隔两秒用nodejs的文件模块读取本地input.txt文本内容,然后在while循环里用request模块通过get请求把文本内容发送到云服务器,原本的代码是把while的循环控制条件写死成true让它一直循环,在云服务器上终端里查看始终接收不到数据,后来测试直接在浏览器里发起单次get请求能接到数据,之后把while循环的控制条件改成循环10次,云服务器终端里查看,在while循环执行的过程中,无法接收到数据,但是10次循环结束后,能够一次性接收10次数据,我的初衷是想让服务器能够实时监控文本数据内容,请问如何改这段代码,本人想应该是同异步请求有关


const request=require('request')
const querystring=require('querystring')
var fs = require("fs");
var data = fs.readFileSync('input.txt');
    data=data.toString();
    
let fun = () => console.log('time out');
function sleep(delay) {
    var start = (new Date()).getTime();
    while ((new Date()).getTime() - start < delay) {
      continue;
    }
}
 
sleep(2000);
    
    var obj={
        'data':data,
    };
console.log(obj)
var content;
var url;
var control=10;
while(control--){
    data=fs.readFileSync('input.txt');
    data=data.toString();
    obj={
        'data':data,
    };
            content=querystring.stringify(obj);
            console.log(content)
            url='https://www.example.com/dataRequestServer?'+content;
         request.get({
                'url':url,
            },(error,response,body)=>{
                 let result=JSON.parse(body);
                 result.code=req.query.code;
                 res.json(result);
                
            })


        
     sleep(2000);
}

request.get 是异步的,你一下开启了10个任务,和一个主线任务,可能主线任务先结束,然后10个异步任务才执行,我看看怎么改你看的懂

const request = require('request')
const querystring = require('querystring')
var fs = require("fs");
var data = fs.readFileSync('input.txt');
data = data.toString();

let fun = () => console.log('time out');

function sleep(delay) {
    var start = (new Date()).getTime();
    while ((new Date()).getTime() - start < delay) {
        continue;
    }
}

sleep(2000);

var obj = {
    'data': data,
};
console.log(obj)
var content;
var url;
var control = 10;

sendFile()

async function sendFile() {
    while (control--) {
        data = fs.readFileSync('input.txt');
        data = data.toString();
        obj = {
            'data': data,
        };
        content = querystring.stringify(obj);
        console.log(content)
        url = 'https://www.example.com/dataRequestServer?' + content;
        await new Promise((resolve, reject) => request.get(url, (error, response, body) => {
            console.log(body)
            if (error) {
                reject(body)
            } else {
                resolve(body)
            }
        }))


        sleep(2000);
    }
}

这牵扯到宏任务和微任务! 你看下就明白啦 或者你把wihile 中写成同步, 或者使用promise 和async wait

你别用while循环,用页面定时器timer

执行需要在你一次get请求成功之后,在成功方法里面写停留2秒后,再去执行下一个一次


const request=require('request')
const querystring=require('querystring')
var fs = require("fs");
var data = fs.readFileSync('input.txt');
    data=data.toString();
    
let fun = () => console.log('time out');
function sleep(delay) {
    var start = (new Date()).getTime();
    while ((new Date()).getTime() - start < delay) {
      continue;
    }
}
 
sleep(2000);
    
    var obj={
        'data':data,
    };
console.log(obj)
var content;
var url;
setInterval(()=>{
    data=fs.readFileSync('input.txt');
    data=data.toString();
    obj={
        'data':data,
    };
            content=querystring.stringify(obj);
            console.log(content)
            url='https://www.example.com/dataRequestServer?'+content;
         request.get({
                'url':url,
            },(error,response,body)=>{
                 let result=JSON.parse(body);
                 result.code=req.query.code;
                 res.json(result);
                
            })
},2000)
     sleep(2000);
}

我也遇到过这种问题,不要用while循环,要用for,加上async 和 await new Promise的写法