javascript - 使用 NodeJS/ES6 重试失败的尝试

标签 javascript node.js

前言:我是有 C++ 背景的,对 Javascript 比较陌生。

我正在使用公共(public) npm 库编写一个 NodeJS 应用程序来请求几组数据。数据源速率限制请求,在一些极端情况下会达到这些速率限制。当达到这些限制时,API 只会在处理更多请求之前返回“超出速率限制”几秒钟。

当我收到数据时,我尝试使用 .map() 解析它。然而,当超过速率限制时,整个应用程序就会崩溃,因为 map() 仅适用于数组,而“Rate Limit Exceeded”消息只是一个简单的对象。

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]);

我想通过检测“超出速率限制”消息来解决这个问题,等待几秒钟,然后重试。

根据我目前的理解,setTimeout() 将是一个很好的候选者,但我不明白如何让它递归工作。本质上,我希望它每五秒重新请求一次数据,直到数据被正确处理。

TL;DR:我想要一个函数使用 setTimeout() 递归调用自身,直到它正确接收数据;或者如果有更好的方法来实现这一点,我会洗耳恭听。

最佳答案

您在这里可以做的是使用 setInterval() 并每隔 n 秒继续检查一次。获取数据后,您可以使用 clearInterval() 退出 setInterval()

请注意,我在此上下文中使用 jQuery,因为我不确定您是否使用任何特定的 NPM 包来请求数据。

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>

到目前为止,在这个例子中,我的 setInterval() 将只运行一次,因为它首先获取数据。但在您的示例中,它会一直运行,直到您收到数据。

此外,我无法建议您应该如何比较您的错误消息,因为我不确定返回错误消息的 API 是 JSON 还是纯文本形式。这取决于您如何根据响应数据类型比较错误消息。

关于javascript - 使用 NodeJS/ES6 重试失败的尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47875781/

相关文章:

node.js - 如何使用永久 sqlite 数据库运行我的 node.js 进程?

javascript - Nodejs : Run a js file on node server startup

json - 在 Microsoft BotBuilder NodeJS SDK 中设置 waterfall 对话的下一步

javascript - 使用 call() 进行继承。为什么它会持续存在?

javascript - 如何将 css 中的行从桌面上的 3x3 更改为移动设备上的 2x4?

javascript - Kendo UI-数据显示问题

node.js - 从浏览器插件/扩展控制 Arduino 设备

node.js - Graphicsmagick Node 不写入 jpg

php - 为我的网站寻找标签脚本

javascript - 按日期过滤 Crossfilter 维度