我收到一条错误消息"超出了费率限制"当我尝试从GDAX请求历史数据时。我使用promises和setInterval从GDAX请求历史价格数据,如下所示:
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.
速率限制 超过速率限制时,将返回429 Too Many Requests的状态。
REST API 公共端点 我们通过IP限制公共端点:每秒3个请求,每秒最多6个请求。
答案 0 :(得分:1)
如果你有一个承诺,那么请求已经发出,所以你的promiseArray是一系列正在进行的请求。
假设我有一系列网址并使用fetch
来获取内容。使用map
将网址映射到承诺并将承诺数组提供给Promise.all
:
Promise.all(
urls.map(fetch)
).then(
resulst=>...
);
如果网址有10个项目,此程序将立即发出10个请求。
您可以将fetch
函数传递给一个限制函数,该函数将以每秒3次调用的方式调度获取。油门功能将返回一个承诺,但不会立即调用fetch。
可以找到throttlePeriod函数here。如果您只是要从该模块复制粘贴代码而不导入整个模块,那么您还需要later函数,因为throttlePeriod依赖于它。
const fetchMaxThreePerSecond = throttlePeriod(3,1100)/*give it an extra 100*/(fetch)
Promise.all(
urls.map(fetchMaxThreePerSecond)
).then(
resulst=>...
);
负责限制,但如果你知道Promise.all
如何运作,你知道如果只有一个拒绝,所有的承诺都会被拒绝。因此,如果你有一百个网址和99个解决方案,但有一个拒绝你的.then
永远不会被调用。你将失去99个成功的请求。
您可以将承诺传递给不会拒绝的Promise.all
,您可以通过捕获被拒绝的承诺并在catch中返回一个特殊值,您可以在处理结果时将其过滤掉:
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 :(得分:0)
当我将速率限制器设置为每2.1秒3个API调用时,我对GDAX历史记录调用没有任何问题。
当我每隔1.8秒将速率限制器设置为3个API调用时,我偶尔会遇到一些问题。
我已使用自动化测试测试了这些值。
重要提示:我对GDAX的所有电话共享相同的速率限制器(!)
要保存,请使用@ HMR的答案中的代码以及我测试的参数。