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

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

回到顶部