对 axios 请求问题评分 limit/throttle

Rate limit/throttle for axios requests issue

在这个class中,get(item)方法returns一个promise和从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 wrapper 方法的外部函数。
它正在使用 bluebirdjs 的 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 延迟的 axios 完成之前执行

此实施无效,我希望修复它并正确评价 limit/throttle

感谢反馈

由此变化:

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

对此:

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

您必须将函数引用传递给 .then() 以便稍后可以调用它。您立即调用它并将其 return 结果传递给 .then(),这不是 .then() 的工作方式。

此外,更改此:

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

return response;

因为他们完成了同样的事情,但第二个要简单得多。