Ограничение скорости / дроссельная заслонка для выдачи запросов axios

В этом классе метод get(item) возвращает обещание с объектом данных ответа, полученным в результате вызова axios.

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

class MyClass {
    constructor () {}

    get(item){

      console.log(`making request`);
      return wait(250).then(
        axios.get(`https://some_url.com/${item.id}`, {
              params: { api_key: "some_key" }
          }).then((response) => {
              console.log(`RESPONSE IS ${response}`);
              return new Promise( (resolve) => { return resolve(response); })
          })
        )

    }
}
module.exports = MyClass;

это внешняя функция, которая повторно вызывает get(item) метод оболочки axios.
Она использует Promise.mapseries (http://bluebirdjs.com/docs/api/promise.mapseries.html)

var myClass = require('./myClass');
...
bluebird.mapSeries(someArray), function(arrayItem){
return new myClass().get(arrayItem)
 .then((response_object) => {
    //TypeError: Cannot read property 'then' of undefined
  });
})
.then(function(something){
  // do nothing
  })
});
...

код не работает в функции более высокого уровня, где он выдает TypeError: Cannot read property 'then' of undefined при выполнении до того, как завершатся аксиомы с задержкой 250ms

Эта реализация не работает, и я хочу исправить ее и правильно ограничить скорость / дроссель

Обратная связь оценена


person Ridhwaan Shakeel    schedule 13.05.2021    source источник


Ответы (1)


Измените это:

return wait(250).then(axios.get(...))

к этому:

return wait(250).then(() => axios.get(...))

Вы должны передать ссылку на функцию в .then(), чтобы он мог вызвать ее позже. Вы вызывали его немедленно и передавали результат его возврата в .then(), что не так, как работает .then().

Также измените это:

return new Promise( (resolve) => { return resolve(response); })

to

return response;

поскольку они делают то же самое, но второй вариант намного проще.

person jfriend00    schedule 13.05.2021