使用XMLHttpRequest发送后,请求在nodejs服务器上挂起

时间:2017-07-20 21:01:32

标签: 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.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 }));
});

等待:

//sleep for X ms
function wait(ms) {
  var start = new Date().getTime();
  var end = start;
  while (end < start + ms) {
    end = new Date().getTime();
  }
}

我正在使用var app = express();

当我发送一个请求时,一切正常。

当我发送两个或更多请求时,第二个,第三个和下一个请求处于状态挂起状态,并在第一个请求完成后执行。

我不知道为什么,我使用xhr.open("POST", API_URL, true);,这意味着true是异步的。

我需要异步执行for for循环(在服务器端)。

感谢您的帮助。

我想模拟一些日志功能,这需要花费很多时间......

所以,我需要一些循环,这需要一些时间,例如30秒服务器任务函数异步到前端。

2 个答案:

答案 0 :(得分:1)

您的wait()函数实际上阻止了该帖子。

Javascript是事件驱动的,但是单线程,这意味着Node需要释放线程才能回复另一个请求。

使用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)
});

答案 1 :(得分:0)

为什么不在服务器端执行此操作?:

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));
});