前言:来自C ++背景后,我对Javascript更新。
我正在使用公共npm库编写NodeJS应用程序来请求几组数据。数据源速率限制请求,并且在一些极端情况下,这些速率限制被命中。当达到这些限制时,API将仅返回"超出限速"在处理更多请求之前几秒钟。
当我收到数据时,我尝试使用.map()
解析它。但是,当速率限制超过时,整个应用程序都会崩溃,因为map()
仅适用于阵列,并且超过了速率限制"消息只是一个简单的对象。
if (message.message === 'Rate limit exceeded') { //This check doesn't work btw
console.log('There was a problem parsing data from the server: ' + err);
return;
}
var items = data.map(item => ({
time: new Date(item[0] * 1000),
low: item[1],
high: item[2],
open: item[3],
close: item[4],
volume: Number(item[5])
}));
for(var i = 0; i < items.length; i++)
dataStore.push(items[i]);
我想通过检测&#34;超出限速率来解决这个问题&#34;消息,等待几秒钟,然后重试。
从我目前的理解,setTimeout()
将是一个很好的候选人,但我不明白如何让它以递归方式工作。基本上,我希望它每五秒重新请求一次数据,直到数据得到正确处理。
TL; DR:我希望函数以setTimeout()
递归调用自身,直到它正确接收数据为止;或者如果有更好的方法来实现这一点,我全都听见了。
答案 0 :(得分:1)
这里你可以做的是使用a
并继续每n秒检查一次。获得数据后,您可以使用setInterval()
退出setInterval()
。
请注意,我在此上下文中使用jQuery,因为我不确定您是否使用任何特定的NPM包来请求数据。
clearInterval()
let retryAfter = 10000; //10 seconds
setInterval(function fetchData() {
$.get('//api.jsonbin.io/b/5a3823a38aaf400a97709c43', (data) => {
// Keep on retrying
console.log(data);
// If you get the data, just exit the setInterval
if(data) {
clearInterval(fetchData);
}
});
}(), retryAfter);
//() brackets here is to execute the function without the first 10 sec delay
截至目前,在此示例中,我的<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
只会在首先获取数据时运行一次。但在您的示例中,它将一直运行,直到您收到数据。
此外,我不能建议您如何比较您的错误消息,因为我不确定返回错误消息的API是JSON还是纯文本形式。这取决于您如何根据响应数据类型比较错误消息。
答案 1 :(得分:0)
你可以这样做 if(Array.isArray(data)=== false)return;
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray