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后,我如何在new
thread
中启动此“循环任务”(“/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)
});