关于nodejs 并发请求问题
http://localhost:8080/TestNode 只是简单的输出HelloWorld
运行以下代码 控制台先输出 i 1-1000之后,才进行并发请求此服务。
请问这是什么问题? 谢谢。
var http = require('http');
for(var i = 0; i < 1000; i ++) {
console.log(i);
var req = http.get({host:'localhost', port:8080, path:'/TestNode',agent:false},function(res) {
resultdata = '';
res.on('data',function(chunk) {
resultdata += chunk;
});
res.on('end',function() {
console.log('return ' + resultdata);
});
});
req.on('error',function(err) {
console.log('problem with request: ' + err.message);
});
}
6 回复
因为异步。 循环先结束的,而"end"事件是后触发的。
我把i的值,改到100000 看到控制台也是先走完循环,才去请求的。 如何让i一边循环,一边去执行 get请求呢。谢谢!
@ironheart 用循环是不能保证这些请求的顺序的,只能是并发。如果要挨个请求,最好是用递归调用的方式,当一个end事件触发后,再回调函数一次。
用循环是不能保证从0…100的请求顺序的
实验代码:
var http = require('http');
for(var i = 0; i < 10; i ++) {
(
function(i){
var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
resultdata = '';
res.on('data',function(chunk) {
resultdata += chunk;
});
res.on('end',function() {
console.log(i)
console.log('return ' + resultdata.length);
});
});
req.on('error',function(err) {
console.log('problem with request: ' + err.message);
});
}
)(i)
}
@ironheart 再贴一个顺序请求版的:
var http = require('http');
function seqRequest(i,limit){
var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
resultdata = '';
res.on('data',function(chunk) {
resultdata += chunk;
});
res.on('end',function() {
console.log(i)
console.log('return ' + resultdata.length);
if(i<limit){
seqRequest(i+1,limit)
}
});
});
req.on('error',function(err) {
console.log('problem with request: ' + err.message);
});
}
seqRequest(0,10)
@fxsjy 你好,感谢您的回复,弱弱的问一下: 在此循环中 加入console.log(i); 此代码还是打完 1-1000000 才去执行get请求 ,这是为什么呢,谢谢!
var http = require('http');
for(var i = 0; i < 1000000; i ++) {
(
console.log(i);
function(i){
var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
resultdata = '';
res.on('data',function(chunk) {
resultdata += chunk;
});
res.on('end',function() {
console.log(i)
console.log('return ' + resultdata.length);
});
});
req.on('error',function(err) {
console.log('problem with request: ' + err.message);
});
}
)(i)}
@ironheart 这是正常的。 你可以这样想,循环的过程中http.get做的事情不过是把请求推送到某个队列,是立即返回的。 底层有个线程帮你把队列中的request拉出来发给host,然后得到响应后(这里有延时)最终再去回调那些事件函数。