最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

使用NodeJSES6重试失败的尝试

IT培训 admin 6浏览 0评论

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

前言:来自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]);

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

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

TL; DR:我想要一个函数用setTimeout()递归调用自己,直到它正确接收数据;或者如果有更好的方法来实现这一目标,我全都听见了。

回答如下:

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

请注意,我在此上下文中使用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/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

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

前言:来自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]);

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

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

TL; DR:我想要一个函数用setTimeout()递归调用自己,直到它正确接收数据;或者如果有更好的方法来实现这一目标,我全都听见了。

回答如下:

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

请注意,我在此上下文中使用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/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论