Q promises中的并发限制 - 节点

Fél*_*anz 7 javascript concurrency asynchronous node.js q

有没有任何方法可以使用Q promises库限制promises的并发性?

这个问题与我如何限制Q promise并发有关?

但问题是我正在尝试做这样的事情:

for (var i = 0; i <= 1000; i++) {
  return Q.all([ task1(i), task2(i) ]); // <-- limit this to 2 at a time.
}
Run Code Online (Sandbox Code Playgroud)

真实的用例是:

  1. 从DB中获取帖子
  2. 在DB中循环每个帖子 posts.forEach(function(post) {}
  3. 对于每个帖子做task1,task2,task3(检索社交计数器,检索评论计数等)
  4. 在DB中保存新的帖子数据.

但问题是节点同时执行所有帖子的所有任务,比如同时向facebook询问500个帖子的"喜欢计数".

我怎么能限制Q.all()所以一次只有2个帖子正在执行他们的任务?或者其他可能的解决方案适用于此?

注意:大多数任务(如果不是全部)都依赖于请求库

Fél*_*anz 3

感谢 Dan,他的回答以及他帮助将其与我的代码集成,可以使用他的要点和片段来完成,如下所示:

var qlimit = require('../libs/qlimit');

var test = function(id) {
  console.log('Running ' + id);
  return Q.nfcall(request, 'some dummy url which takes some time to process, for example a php file with sleep(5)').spread(function(response, body) {
    console.log('Response ' + id);
    return body;
  });
}

test = qlimit.limitConcurrency(test, 1);

var data = [0, 1, 2];

data.forEach(function(id) {
  console.log('Starting item ' + id);
  Q.all([ test(id) ]);
});
Run Code Online (Sandbox Code Playgroud)

这样你会得到类似的东西:

  • 起始项目 0
  • 起始项目 1
  • 起始项目 2
  • 运行 0
  • 回复 0
  • 跑步1
  • 回应1
  • 跑步2
  • 回应2

这显然是一次 1 个请求。

我在实现中缺少的一点是,您需要在启动循环之前使用 limitConcurrency 重新声明该函数,而不是在循环内部。