如何限制Q promise并发?

Dan*_*mov 12 javascript concurrency node.js promise q

如何编写限制Q promise并发的方法?

例如,我有一个方法spawnProcess.它返回一个Q承诺.
我希望一次生成的进程不超过5个,但对调用代码透明.

我需要实现的是一个带签名的函数

function limitConcurrency(promiseFactory, limit)
Run Code Online (Sandbox Code Playgroud)

我可以这样打电话

spawnProcess = limitConcurrency(spawnProcess, 5);

// use spawnProcess as usual
Run Code Online (Sandbox Code Playgroud)

我已经开始研究我的版本,但我想知道是否有人有一个我可以检查的简洁实现.

For*_*say 9

我有一个库为你做这个https://github.com/ForbesLindesay/throat

您可以通过browserify使用它或从brcdn(https://www.brcdn.org/?module=throat&version=latest)下载独立版本并将其添加为脚本标记.

然后(假设Promise构造函数是polyfilled或在您的环境中实现),您可以:

//remove this line if using standalone build
var throat = require('throat');

function limitConcurrency(promiseFactory, limit) {
  var fn = throat(promiseFactory, limit);
  return function () {
    return Q(fn.apply(this, arguments));
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以直接打电话throat(promiseFactory, limit),但这会返回一个承诺承诺,而不是一个Q承诺.

我也非常喜欢将它与array.map一起使用.

// only allow 3 parallel downloads
var downloadedItems = Q.all(items.map(throat(download, 3)));
Run Code Online (Sandbox Code Playgroud)