本人想要实现的功能是每隔两秒用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的写法