簡體   English   中英

在 nodejs 中執行下一次迭代之前等待 API 返回其響應

[英]Wait for API to return its response before executing the next iteration in nodejs

我是 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 並應該返回結果,並且我需要根據結果相應地更新數據庫集合。 然后應該回到 1code 並需要獲取第一個索引值,即“AA”並重復該過程。

在執行 2 個 API 后,我收到以下錯誤

請求失敗,狀態碼為 429。您已超過每分鍾的最大請求數。

我想這是因為它不會等到請求處理每個值。 如何通過添加每分鍾延遲 5 個 API 調用的設置超時來解決它。

您可以使用 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);)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM