Не удается получить доступ к элементам массива, используя ограничитель запросов для запросов API - PullRequest
0 голосов
/ 31 мая 2019

Прежде всего, спасибо за ваше время здесь.

Я использую 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: Неожиданный токен [

1 Ответ

0 голосов
/ 31 мая 2019

Вы пропустили присвоение переменной в цикле for: (var x = 0; x < final.length; x++)

Другие вещи, которые я заметил:

  1. Это зависит от вашего стиля кодирования и предпочтений, но большую часть времени при цикле я предпочитаю использовать итераторы, такие как .forEach () или .map (), поскольку это делает код намного более декларативным. В этом случае .forEach будет правильным итератором для использования.
  2. Мне легче отлаживать код, если он непротиворечивый, подумайте о том, чтобы придерживаться синтаксиса версий 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)
           }
         })
       })
     }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...