是否有任何方法可以限制这个for循环最多50个循环?



这是一个非常不寻常的代码,我没有自己写,每天一个数据库更新大约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循环,但我看到的所有解决方案都打破了"${record.name}"作为url的一部分,我必须遍历整个数据库的整个视图。

我不确定这是否适合这种情况,但是您可以在循环之外定义一个计数器,在内部增加并在达到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,它在每次循环执行body时递增。因此,对于你提供的循环,它看起来像这样:

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次)。

最新更新