[英]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.