Javascript 使用XMLHttpRequest发送后,nodejs服务器上的请求挂起
我正在使用前端代码发送请求:Javascript 使用XMLHttpRequest发送后,nodejs服务器上的请求挂起,javascript,node.js,Javascript,Node.js,我正在使用前端代码发送请求: function sendDataToApi(json, callback) { var xhr = new XMLHttpRequest(); xhr.open("POST", API_URL, true); xhr.setRequestHeader("Content-type", "application/json"); xhr.onreadystatechange = function () { if (xhr.
function sendDataToApi(json, callback) {
var xhr = new XMLHttpRequest();
xhr.open("POST", API_URL, true);
xhr.setRequestHeader("Content-type", "application/json");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
callback(JSON.parse(xhr.responseText));
}
};
xhr.send(json);
}
在服务器端,有一个代码:
var iterator = 0;
app.post('/api', function (req, res) {
loop = getRandomInt(10, 30); // generate random int in range 10-30
//execute loop and wait after 1s for a X (var loop) second
console.log("Task id: " + iterator + " started: " + loop + "ms");
for (i = 0; i < loop; i++) {
console.log(" tick: " + i);
wait(1000);
}
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ response: iterator }));
});
var迭代器=0;
app.post('/api',函数(req,res){
loop=getRandomInt(10,30);//生成10-30范围内的随机整数
//执行循环并在1s后等待X(变量循环)秒
log(“任务id:+iterator+”已启动:“+loop+”ms”);
for(i=0;i
等等:
//睡眠时间为X毫秒
函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
我使用的是var-app=express()代码>
当我发送一个请求时,一切正常
当我发送两个或多个请求时,第二个、第三个和下一个请求处于pendign状态,并且在第一个请求完成后执行
我不知道为什么,我正在使用xhr.open(“POST”,API\uurl,true)代码>这意味着true是异步的
我需要异步执行for循环(在服务器端)
谢谢你的帮助
我想模拟一些日志函数,这需要很多时间
因此,我需要一些循环,这需要一些时间,例如30秒的服务器任务函数异步到前端。为什么不在服务器端执行此操作
app.post('/api', function (req, res) {
setTimeout(function(){
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ response: req.myUniqueRequestParam }));
}, Math.floor(Math.random() * 30 * 1000));
});
您的wait()
函数正在有效地阻止线程
Javascript是事件驱动的,但是单线程的,这意味着节点需要先释放线程,然后才能响应另一个请求
在使用Web服务器时,永远不要像那样阻塞线程,而是在需要等待时创建异步代码
var iterator = 0;
app.post('/api', function(req, res) {
var loop = getRandomInt(10, 30);
setTimeout(function() {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
response: iterator
}));
}, loop * 1000)
});
等待
做什么?我猜它阻塞了线程,这就是为什么您必须等待第一个请求完成的原因。您不能阻止线程。@adeneo我在问题中添加了等待函数。确切地说,它正在阻止。这就是你的问题所在,只需一个setTimeout
而不是wait
,你就可以执行多个请求,因为线程没有被阻塞。调用app.post后,我如何在newthread
中启动此“循环任务”(“/api”
在前端服务器中?你不能,javascript是单线程的。但是,你可以使用许多不同的方法在多个线程中运行整个服务器,但这不是解决方案,你应该删除阻塞忙等待函数。因为我想模拟一些日志函数,这需要很多时间…所以,我需要一些循环,这需要一些时间,例如30秒异步到前端。
var iterator = 0;
app.post('/api', function(req, res) {
var loop = getRandomInt(10, 30);
setTimeout(function() {
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({
response: iterator
}));
}, loop * 1000)
});