首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDAX API -超出速率限制

GDAX API -超出速率限制
EN

Stack Overflow用户
提问于 2018-02-03 11:16:41
回答 2查看 947关注 0票数 0

当我尝试从GDAX请求历史数据时,我收到一条错误消息,提示“超过速率限制”。我使用promises和setInterval从GDAX请求历史价格数据,如下所示:

代码语言:javascript
复制
let promiseArray = //Array with promises
let j = 0;
let grabPrices = setInterval(() => {
    if (j === promiseArray.length) {
        //Do something when all promises have been resolved
    } 
    else {
        promiseArray[j].then(
            data => {
                //Work with data
            }
        ).catch(error => console.log('An error occurred: ' + error));
        j++;
    }
}, 1000) //I have even tried to use 10 seconds (10000) as a second argument to setInterval, but it doesn't make any difference.

official API documentation

速率限制当超过速率限制时,将返回429过多请求的状态。

REST API公共端点我们按IP限制公共端点:每秒3个请求,突发每秒最多6个请求。

EN

回答 2

Stack Overflow用户

发布于 2018-02-04 12:10:12

如果你有一个承诺,那么这个请求就已经发出了,所以你的promiseArray是一个正在进行的请求数组。

假设我有一个urls数组,并使用fetch来获取内容。使用map将url映射到promise,并将promises数组提供给Promise.all

代码语言:javascript
复制
Promise.all(
  urls.map(fetch)
).then(
  resulst=>...
);

如果urls有10个项目,该程序将立即发出10个请求。

您可以将fetch函数传递给一个节流函数,该函数将以每秒只调用3次的方式调度fetch。throttle函数将返回一个promise,但不会立即调用fetch。

可以在here中找到throttlePeriod函数。如果您只打算从该模块复制粘贴代码,而不导入整个模块,那么您还需要later函数,因为throttlePeriod依赖于它。

代码语言:javascript
复制
const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch)
Promise.all(
  urls.map(fetchMaxThreePerSecond)
).then(
  resulst=>...
);

这解决了节流问题,但是如果您知道Promise.all是如何工作的,那么您就会知道,如果只有一个人拒绝,那么所有的承诺都会被拒绝。因此,如果您有100个urls和99个解析,但有一个拒绝,您的.then永远不会被调用。您将丢失这99个成功的请求。

您可以向Promise.all传递一个不会被拒绝的promise,您可以通过捕获一个被拒绝的promise并在catch中返回一个特殊的值来实现这一点,您可以在处理结果时将其过滤掉:

代码语言:javascript
复制
const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch);
const Fail = function(reason){this.reason = reason;};
const isFail = x=>(x&&x.constructor)===Fail;
const isNotFail = x=>!isFail(x);
Promise.all(
  urls.map(
    url=>
      fetchMaxThreePerSecond(url)
      .catch(e=>new Fail([url,e]))//save url and error in Fail object
  )
)
.then(//even if a request fails, it will not reject
  results=>{
    const successes = results.filter(isNotFail);
    const failed = results.filter(isFail);
    if(failed.length!==0){
      console.log("some requests failed:");
      failed.forEach(
        (fail)=>{
          const [url,error] = fail.reason;
          console.log(`Url: ${url}`);
          console.log(JSON.stringify(error,undefined,2));
        }
      )
    }
  }
); 
票数 1
EN

Stack Overflow用户

发布于 2018-02-18 01:37:49

当我将速率限制器设置为每2.1秒3次API调用时,GDAX历史调用没有问题。

当我将速率限制器设置为每1.8秒调用3次API时,我偶尔会遇到一些问题。

我已经用自动化测试测试了这些值。

重要提示:我对GDAX的所有调用都共享相同的速率限制符(!)

为了保存,请将@HMR答案中的代码与我测试的参数一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48593588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档