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

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 python动态规划:N根火柴摆出的最大数字
  • ¥20 (标签-excel)
  • ¥200 求idea10和MyEclipse7.1
  • ¥20 vb6.0截取当前窗体保存为jpg文件
  • ¥20 苹果手机不使用大疆sdk怎么获取遥控器控制信息或如何接入大疆sdk并且成功上架sdk
  • ¥20 woocommerce 注册按键重定向
  • ¥100 求书法图像文字切割代码
  • ¥15 同一个波形探测距离不同的目标,为什么fft之后得到的频谱图会发生移动,不应该时移不改变幅度谱吗(标签-matlab)(相关搜索:matlab仿真)
  • ¥15 Proteus仿真程序只能执行一次
  • ¥15 语音识别websocket报错