等待API返回其响应,然后再在nodejs中执行下一次迭代

时间:2020-10-23 12:46:39

标签: node.js

我是nodejs的新手。 我有一个字符串数组,包含大约30000个以上的值,格式如下:

tickerArray = ["A","AA","AAA", ..........., "C"]

我想遍历这些,并且需要将每个值发送到外部polygon.io API。但是Polygo.io免费计划每分钟仅允许5个API调用。下面是我的代码。

await tickerArray.reduce((key:any, tickerSymbol:any) =>
    key.then(async () => await stockTickeDetails.runTask(tickerSymbol)),
    starterPromise
    );
}).catch(function (error: any) {
    console.log("Error:" + error);
   });

我的runTask函数如下:

public  runTask(tickerSymbol:any) {
 return  axios.get('https://api.polygon.io/v1/meta/symbols/' + tickerSymbol + '/company?apiKey=' + process.env.API_KEY).then(
   function (response: any) {
        console.log("Logo : " + response.data.logo + 'TICKER :' + tickerSymbol);
        let logo = response.data.logo;
        let updateLogo =  stockTickers.updateOne({ ticker: tickerSymbol }, { $set: { "logo": logo } })
      }).catch(function (error: any) {
        console.log("Error from symbol service file : " + error);
      });

}

这就是我需要的,如果我将第0个索引值(即“ A”)传递给runTask方法,它将处理API并返回结果,并从结果中我需要相应地更新数据库集合。 然后应返回到1码,并需要获取第一个索引值即“ AA”并重复该过程。

在执行2个API之后,出现以下错误

请求失败,状态码为429。您已超出每分钟的最大请求数。

我猜这是因为它不等到请求处理每个值。如何通过添加一个设置的超时来解决该问题,该超时会每分钟延迟5次API调用。

1 个答案:

答案 0 :(得分:0)

您可以使用Promise模式轻松实现此目标,这是您的解决方案:

var tickerArray = ["A","AA","AAA", ..........., "C"]
let requests = tickerArray.map(tickerSymbol => {
   //generate a promise for each API call
   return new Promise((resolve, reject) => {
      request({
         uri: https://api.polygon.io/v1/meta/symbols/' + tickerSymbol + '/company?apiKey=' + process.env.API_KEY,
         method: 'GET'
      },
      (err, res, body) => {
      if (err) { reject(err) }
      //call to resolve method which is passed to the caller                             
      //method passed to the promise
      resolve( { response : body, request: tickerSymbol })
      })
   })
})

Promise.all(requests).then((objArray) => { 
//this is expected when all the promises have been resolved/rejected.
    objArray.forEach(obj => {
        if (obj) {
            console.log("Logo : " + obj.response.data.logo + 'TICKER :' + obj.request);
            let logo = obj.response.data.logo;
            let updateLogo =  stockTickers.updateOne({ ticker: obj.request }, { $set: { "logo": logo } })
        }
    })
}).catch(error => console.log("Error from symbol service file : " + error);)
相关问题