首先,谢谢您在这里的时间。
我正在使用node.js以编程方式进行API调用。我有一个充满数字的数组,我想遍历它以发送API请求以检查数字是否有效。问题是我需要管理我的API请求的吞吐量以避免HTTP 429(由于API提供程序限制)。我还使HTTP连接保持活动状态,以加快请求速度。
我正在使用外部请求限制器https://www.npmjs.com/package/limiter。
为简单起见,我将把数字检查作为依赖项包括在内,该依赖项虽然不存在,但是是为了避免使事情变得更复杂。
我的代码如下:
var RateLimiter = require('limiter').RateLimiter;
var http = require('http');
var Checknumber = require('numbercheck')
var agent = new http.Agent({
keepAlive: true,
maxSockets: 1,
keepAliveMsecs: 3000
})
//final is the array containing 100 phone numbers
var final = [xxxxxxxx, xxxxx, .......,];
//This limit the API requests to 1 per second
var limiter = new RateLimiter(1, 'second');
for (x=0; x<final.length; x++){
limiter.removeTokens(1, function() {
console.log(final[x], x);
//This console.log is to debug
Checknumber.get({ number: final[x]}, (error, response) => {
if (error) {
console.error(error)
}
else {
console.log(response)
}
}
)}
)}
我得到的结果是final[x] is undefined
,因此API请求失败了
console.log(final[x], x)
返回:undefined 100
似乎无法通过索引访问final[x]
。
能在这里帮忙吗?
致谢
我还试图在final[x]
中传递limiter.removeTokens(1, function(final[x]) {...
但我得到
SyntaxError:意外令牌[
答案 0 :(得分:0)
您错过了for循环中的变量分配:
(var x = 0; x < final.length; x++)
我注意到的其他事情:
如果发现一致的代码,我发现它更容易调试,请考虑使用ECMAScript版本语法,因此,如果要使用ES6(使用箭头功能),请在整个过程中使用它。还可以考虑使用const并使用var代替。
final.forEach((item, index) => {
limiter.removeTokens(1, () => {
console.log(item, index);
Checknumber.get({ number: item}, (error, response) => {
if (error) {
console.error(error)
} else {
console.log(response)
}
})
})
}