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

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 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示