簡體   English   中英

有什么辦法可以將這個 for 循環限制為最多 50 個循環?

[英]Is there any way i can limit this for loop to a maximum of 50 loops?

這是一個非常不尋常的代碼,我還沒有自己寫過,每天數據庫都會更新大約 200 條記錄。 這意味着我們必須在每天早上 7 點調用 200 次 API 來找出有關這些記錄的信息。 到目前為止,這一直運行良好,api 實施了每小時 50 次 api 調用的限制,如果你嘗試進行 51 次調用,你將被禁止 24 小時......

那么,如何讓 for 循環在這里最多執行 50 次循環?

for (let record of records ) {
    //This loop has to be limited to 50 iterations pr run.
    let brregRawData = await fetch(`some url/${record.name}/someurl`);
    let brregJson = await brregRawData.json()
    let personNavn = brregJson.rollegrupper[0].roller[0].person.navn.fornavn
    let personEtternavn = brregJson.rollegrupper[0].roller[0].person.navn.etternavn
    // if mellomnavn = undefined, then do nothing
    if (brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn == undefined) { 
        var personMellomNavn = ""
    } else {
        let personMellomNavn = brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn + " "
    }

我嘗試查找使用 for 循環的不同方法,但我查看的所有解決方案都破壞了 url 的“${record.name}”部分,我必須遍歷整個數據庫的整個視圖。

我不確定這是否適用於這種情況,但是您可以在循環外部定義一個計數器,在內部遞增並在達到 50 時中斷。

let count = 0;
for (....)
   ...
   if (count++ > 50) break;
   ...

如果我對您的理解正確,您需要將 api 調用次數限制為 50,但當前實現使用for... of循環。 以最少的修改量實現所需內容的最簡單方法是使用標准for循環。

假設這一切都發生在async函數中......

async function limitToFiftyApiCalls(records) {
  const max = Math.min(records.length, 50);
  for (let i = 0; i < max; i++) {
    const record = records[i];
    let brregRawData = await fetch(`some url/${record.name}/someurl`);
    let brregJson = await brregRawData.json();
    let personNavn = brregJson.rollegrupper[0].roller[0].person.navn.fornavn;
    let personEtternavn = brregJson.rollegrupper[0].roller[0].person.navn.etternavn;
    // if mellomnavn = undefined, then do nothing
    if (brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn == undefined) {
      var personMellomNavn = "";
    } else {
      let personMellomNavn = brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn + " ";
    }
  }
}

上面的代碼除了限制 API 調用的數量外,不會對您現有的代碼做太多修改。 但是,您可以做一些事情通常會使代碼更易於閱讀和編輯。

async function limitToFiftyApiCalls(records) {
  const max = Math.min(records.length, 50);
  for (let i = 0; i < max; i++) {
    const record = records[i];
    let personMellomNavn = "";
    let brregRawData = await fetch(`some url/${record.name}/someurl`);
    let brregJson = await brregRawData.json();

    // why write this more than once?
    // save it to a variable and make life easier
    let someVar = brregJson.rollegrupper[0].roller[0].person.navn;
    
    let personNavn = someVar.fornavn;
    let personEtternavn = someVar.etternavn;
    if (someVar.mellomnavn) {
      personMellomNavn = someVar.mellomnavn + ' '
    }
  }
}

一個非常簡單的方法是實現一個每次循環執行主體時遞增的count 因此,對於您提供的循環,它看起來像這樣:

let count = 0; // initialize count as 0

for (let record of records ) {

    if(count >= 50) break; // break out of loop if count is equal to or greater than 50 (since count starts from 0)

    //This loop has to be limited to 50 iterations pr run.
    let brregRawData = await fetch(`some_url/${record.name}/some_url`);
    let brregJson = await brregRawData.json()
    let personNavn = brregJson.rollegrupper[0].roller[0].person.navn.fornavn
    let personEtternavn = brregJson.rollegrupper[0].roller[0].person.navn.etternavn
    
    // if mellomnavn = undefined, then do nothing
    if (brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn == undefined) { 
        var personMellomNavn = ""
    } else {
        let personMellomNavn = brregJson.rollegrupper[0].roller[0].person.navn.mellomnavn + " "
    }

    count++; // Increment the count after each iteration
}

回答你的問題:

for (let i=0; i<math.min(records.length, 50); i++ ) {
  let record = records[i];

但是你沒有檢查過的記錄會怎樣? 你會等24小時嗎? 我想這不是預期的,而是必須每小時檢查 50 條記錄,直到你檢查完所有記錄(所以 200 條記錄檢查 4 次)。

暫無
暫無

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

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