在async模块中,此请求的功能被关闭为“不会修复”。
有一种使用LeakyBucket或Token Bucket模型的解决方案,它作为RateLimiter实施在“limiter” npm模块中。
RateLimiter
,请参见此处的示例:https://github.com/caolan/async/issues/1314#issuecomment-263715550
另一种方法是使用PromiseThrottle
,我使用了这个,下面是工作示例:
var PromiseThrottle = require('promise-throttle');
let RATE_PER_SECOND = 5;
var pto = new PromiseThrottle({
requestsPerSecond: RATE_PER_SECOND,
promiseImplementation: Promise
});
let timeStart = Date.now();
var myPromiseFunction = function (arg) {
return new Promise(function (resolve, reject) {
console.log("myPromiseFunction: " + arg + ", " + (Date.now() - timeStart) / 1000);
let response = arg;
return resolve(response);
});
};
let NUMBER_OF_REQUESTS = 15;
let promiseArray = [];
for (let i = 1; i <= NUMBER_OF_REQUESTS; i++) {
promiseArray.push(
pto
.add(myPromiseFunction.bind(this, i))
);
}
Promise
.all(promiseArray)
.then(function (allResponsesArray) {
console.log("All results: " + allResponsesArray);
});
输出:
myPromiseFunction: 1, 0.031
myPromiseFunction: 2, 0.201
myPromiseFunction: 3, 0.401
myPromiseFunction: 4, 0.602
myPromiseFunction: 5, 0.803
myPromiseFunction: 6, 1.003
myPromiseFunction: 7, 1.204
myPromiseFunction: 8, 1.404
myPromiseFunction: 9, 1.605
myPromiseFunction: 10, 1.806
myPromiseFunction: 11, 2.007
myPromiseFunction: 12, 2.208
myPromiseFunction: 13, 2.409
myPromiseFunction: 14, 2.61
myPromiseFunction: 15, 2.811
All results: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
我们可以从输出中清楚地看到速率,即每秒5个调用。