mathhater 2022-10-14 09:10 采纳率: 64.3%
浏览 116
已结题

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);
}
  • 写回答

6条回答 默认 最新

  • 游一游走一走 2022-10-14 09:32
    关注

    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);
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月14日

悬赏问题

  • ¥15 kubeadm部署k8s出错
  • ¥15 Abaqus打不开cae文件怎么办?
  • ¥20 双系统开机引导中windows系统消失问题?
  • ¥15 小程序准备上线,软件开发公司需要提供哪些资料给甲方
  • ¥15 关于生产日期批次退货退款,库存回退的问题
  • ¥15 手机应用的时间可以修改吗
  • ¥15 docker 运行OPEN-webui异常
  • ¥15 麒麟系统如何删除光盘刻录痕迹
  • ¥15 recipe通过gem协议传的是什么
  • ¥15 TS2307: Cannot find module 'cc'.