关于nodejs 并发请求问题 - CNode技术社区

关于nodejs 并发请求问题
发布于 13 年前 作者 ironheart 15182 次浏览 最后一次编辑是 9 年前

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,然后得到响应后(这里有延时)最终再去回调那些事件函数。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /