2017-06-20 128 views
-1

所以基本上我试图让一吨,(约25,000)GET请求API。我使用axios作为我的库进行HTTP调用。处理25,000 GET请求到一个API

所以我必须:

dsHistPromises.push(axios.get(url)) 

然后我用:

axios.all(dsHistPromises) 
    .then(function(results) { 
     results.forEach(function(response){ 
     if (format === lists.formats.highlow) { 
      storage.darkskyHistoryHighLow.push(requests.parseDarkskyHighLow(response, city)) 
     } 
     // parse data here and print it to files... 
     }) 
    }).catch(err => { 
     throw err 
    }) 

来处理我所有的承诺。

当我尝试运行我的代码,我得到这样的错误

(node:10400) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: read ECONNRESET 

我想象这是我连接到API的问题。服务器可能很难管理我的请求,对吗?

是否有任何技巧可以解决这个问题?

+1

如果您需要提出这么多要求,您可能会做错某些事情。此外,API几乎肯定会限制你在这里。 –

+0

没有什么我可以做我关于电话的数量。我称呼天气api,为几个城市的10年历史数据。每一天都是自己的要求。 –

+0

你必须放慢速度。 –

回答

1

正如你怀疑的那样,我会说这是因为你正在访问的API。大多数理智的API会有某种节制,以防止一个用户把它们关闭。你可能会遇到这种情况。

你需要做的是通过在呼叫之间加入时间延迟来节制你的消息。

有几种方法可以解决这个问题。一个是按顺序完成每个呼叫,一次一个。这将有助于避免来自服务器的限制,但可能会变慢。

如果服务器允许,可以并行执行多个请求。

基本上,它会是这个样子:

const urls = getUrlsToCallFromSomewhere(); 
const delay = 500; // ms 

const next =() => { 
    if (!urls.length) { 
    return; 
    } 

    const url = urls.pop(); 
    axios.get(url).then(data => { 
    results.push(data); 
    const now = Date.now(); 

    if (now - start > delay) { 
     next(); 
    } else { 
     setTimeout(next, delay - (now - start)); 
    } 
    }); 
}; 

这是不是超级完美,但应该给你一个想法。基本上,一次给他们打电话。完成后,检查它已经过了多久。如果您已经输入了delay,请立即致电。如果没有,请使用setTimeout()等待时间。

您可以安排您的代码,同时获取其中的一些代码,以加快速度,并根据需要调整延迟的时间长度或速度。