2011-05-21 236 views
0

我已经做Nodejs: How to write high performance async loop为stormjs,您可以检查stormjs serial loop demo的NodeJS:并行请求,串行响应

但仍然有问题并行循环,例如我们有一个功能requestContext(index, callback(err, context))其远程获取上下文“http://host/post/ {指数}”,我们需要得到的[0-99]的背景下,推动背景下进入该命令的数组,[context0...context99]

但很明显,这个输出着工作stormjs parallel loop

我仍然想知道节点是如何完成这个任务的,但是你必须使这些请求并行,而不是一个一个地执行,它应该是并行请求和串行推送。

+0

一个数组?你为什么不直接写风暴呢? – Raynos 2011-05-21 18:35:45

+0

我不会为此使用风暴,我正在为此创建风暴。我必须确保暴风雨得到了这种情况下的最佳代码,也是类似的情况。问题是如何做到这一点没有stormjs。 – 2011-05-22 02:54:29

回答

1
var counter = 0; 
// create an array with numbers 0 to 99. 

_.range(0,100).forEach(function(key, value, arr) { 
    // for each of them request context 
    requestContext(key, function(err, context) { 
     // add the context to the array under the correct key 
     if (!err) { 
      arr[key] = context; 
     } 
     // increment counter, if all have finished then fire finished. 
     if (++counter === 100) { 
      finished(arr); 
     } 
    }); 
}); 

function finished(results) { 
    // do stuff 
} 

无需风暴。如果你想要一个执行/流量控制库,我会建议Futures,因为它不会编译你的代码并“隐藏魔法”。

此前,您通过每一个递归执行它们并按顺序将它们按顺序推入到数组中。

这次你并行执行它们,并告诉每一个将数组中正确的有序键赋值给它们自己的值。

_.range创建一个包含值0到为什么要使用风暴这个99

+0

谢谢。为什么以前的序列和这个并行,因为代码说。下一个循环是否依赖于前一个循环,将决定串行还是并行。 – 2011-05-22 03:03:14

+0

@guillin您的上一个示例中的每个请求都会返回下一个请求所需的“url”。这一次你前面有100个网站,所以你可以并行地发射它们。 – Raynos 2011-05-22 12:41:58