非阻塞在Node.js循环和池?

我开始玩node.js,我有一个应用程序,它基本上遍历了几十个对象,并为它们执行一些各种asynchronoushttp请求,并使用从http请求返回的各种数据填充对象。问题更多地涉及Node.js的最佳实践,非阻塞操作,可能与池化有关。 原谅我如果我使用了错误的术语,因为我是新手,请不要犹豫,纠正我。

所以下面是一个简单的总结,我有一个循环的代码循环数千

//Loop briefly summarized for (var i = 0; i < arrayOfObjects.length; i++) { do_something(arrayOfObjects[i], function (error, result){ if(err){ //various log }else{ console.log(result); } }); } //dosomething briefly summarized function do_something (Object, callback){ http.request(url1, function(err, result){ if(!err){ insert_in_db(result.value1, function (error,result){ //Another http request with asynchronous }); }else{ //various logging error } }); http.request(url2, function(err, result){ //some various logic including db call }); } 

事实上,在do_something中有一个复杂的逻辑,但现在不是真正的问题所以我的问题是以下

我认为主要的问题是在我的循环没有真正优化,因为这是一种阻塞事件。 所以在dosomething中的第一个http请求结果是可用的,在循环完成处理之后,然后是级联的。 如果有办法某种方式来做类似do_something的10或20最大的同类执行的池,其余的是有种排队时,池资源可用?

我希望自己清楚地解释一下,不要犹豫,问我是否需要细节。

在此先感谢您的反馈意见,

安塞尔姆

你的循环本身并没有阻塞,但是这不是最优的。 它所做的一件事是计划arrayOfObjects.length http请求。 这些请求将全部安排在您的循环中。 在旧版本的node.js中,每个主机默认有5个并发请求,但是这个默认值后来改变了 。

但是,然后实际打开套接字,发送请求,等待响应,这将是每个循环的个人。 并且每个条目将在它自己的时间内完成(在这种情况下,取决于远程主机,或者例如数据库响应时间等)。

看看async , vasync或者其他一些替代方法,就像在评论中提到的那样。

你可以更进一步,使用像Bluebird Promise.map和concurrency选项设置,取决于你的用例。