我正在使用前端代码发送请求:
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秒服务器任务函数异步到前端。
答案 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));
});