如何防止在 JavaScript FOR 循环中重复调用 API
How do I prevent duplicate API Calls in JavaScript FOR Loop
我有一组从网页上抓取的 URL,然后调用 API 来验证这些 URL 以查看它们是否是恶意的。唯一的问题是我每天只能进行一定数量的 API 调用,并且该数组包含重复的 URL。我正在尝试遍历数组并使用已保存的 API 调用来获取重复值,并且我正在努力寻找最佳方法来执行此操作,因为可能存在多个重复项。如果循环遇到重复值,我希望它不进行 API 调用,而只是 return 先前 API 调用中已保存的值。我在下面的代码中包含了一些基本的 sudo 代码,但我不确定用什么填充 sudo 代码。
/* urlToValidate is a list of URLS */
urlToValidate = ["ups.com", "redfin.com", "ups.com", "redfin.com", "redfin.com", "redfin.com"];
var isValid = false;
/* API Overview https://www.ipqualityscore.com/documentation/malicious-url-scanner-api/overview */
for (let i = 0; i < urlToValidate.length; i++) {
if (i == 0 || Is Not A DUPLICATE) {
$.getJSON('https://ipqualityscore.com/api/json/url/<API_KEY>/' + urlToValidate[i], function( json ) {
if (!json.phishing && !json.spamming && json.risk_score < 80) {
isValid = true;
returnMessage(isValid, json.risk_score, i)
} else {
isValid = false;
returnMessage(isValid, json.risk_score, i)
}
});
} else {
returnMessage(alreadySaved duplicateValue, alreadySaved duplicate risk_score, i)
}
}
Desired Output:
URL Valid: true Risk Rating: 0 Position: 7
or
Duplicate URL: true Risk Rating: 0 Position: 7
这是一个简单的缓存问题。
在 for
循环之外,维护 URL 到它们相应的提取结果的某种映射。这样,您不仅可以存储 URL 是否已被调用,还可以存储结果(如果存在)。一个简单的方法是使用一个基本对象,其中“键”是对应于 URL 的字符串,而“值”是您获取的结果。
const resultCache = {};
在循环内部,在 进行提取之前,您应该首先检查缓存是否已经有 URL.
的结果
let result;
if (resultCache[urlToFetch]) {
result = resultCache[urlToFetch];
} else {
// use the previous result
result = await fetch(/* whatever */);
// remember to also store result in cache
resultCache[urlToFetch] = result;
}
您有几个选择。
首先,您可以将 url 转换为 Set
,从而完全避免出现任何重复。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
另一种选择是将 return 存储在一个对象中,键为 url 并在您的 if 语句中检查该值是否不为空。
*** 使用集合更新 ***
/* urlToValidate is a list of URLS */
urlToValidate = ["ups.com", "redfin.com", "ups.com", "redfin.com", "redfin.com", "redfin.com"];
var urls = new Set(urlToValidate);
var isValid = false;
/* API Overview https://www.ipqualityscore.com/documentation/malicious-url-scanner-api/overview */
for (let i = 0; i < urls.length; i++) {
$.getJSON('https://ipqualityscore.com/api/json/url/<API_KEY>/' + urls[i], function( json ) {
if (!json.phishing && !json.spamming && json.risk_score < 80) {
isValid = true;
returnMessage(isValid, json.risk_score, i)
} else {
isValid = false;
returnMessage(isValid, json.risk_score, i)
}
});
}
}
我有一组从网页上抓取的 URL,然后调用 API 来验证这些 URL 以查看它们是否是恶意的。唯一的问题是我每天只能进行一定数量的 API 调用,并且该数组包含重复的 URL。我正在尝试遍历数组并使用已保存的 API 调用来获取重复值,并且我正在努力寻找最佳方法来执行此操作,因为可能存在多个重复项。如果循环遇到重复值,我希望它不进行 API 调用,而只是 return 先前 API 调用中已保存的值。我在下面的代码中包含了一些基本的 sudo 代码,但我不确定用什么填充 sudo 代码。
/* urlToValidate is a list of URLS */
urlToValidate = ["ups.com", "redfin.com", "ups.com", "redfin.com", "redfin.com", "redfin.com"];
var isValid = false;
/* API Overview https://www.ipqualityscore.com/documentation/malicious-url-scanner-api/overview */
for (let i = 0; i < urlToValidate.length; i++) {
if (i == 0 || Is Not A DUPLICATE) {
$.getJSON('https://ipqualityscore.com/api/json/url/<API_KEY>/' + urlToValidate[i], function( json ) {
if (!json.phishing && !json.spamming && json.risk_score < 80) {
isValid = true;
returnMessage(isValid, json.risk_score, i)
} else {
isValid = false;
returnMessage(isValid, json.risk_score, i)
}
});
} else {
returnMessage(alreadySaved duplicateValue, alreadySaved duplicate risk_score, i)
}
}
Desired Output:
URL Valid: true Risk Rating: 0 Position: 7
or
Duplicate URL: true Risk Rating: 0 Position: 7
这是一个简单的缓存问题。
在 for
循环之外,维护 URL 到它们相应的提取结果的某种映射。这样,您不仅可以存储 URL 是否已被调用,还可以存储结果(如果存在)。一个简单的方法是使用一个基本对象,其中“键”是对应于 URL 的字符串,而“值”是您获取的结果。
const resultCache = {};
在循环内部,在 进行提取之前,您应该首先检查缓存是否已经有 URL.
的结果let result;
if (resultCache[urlToFetch]) {
result = resultCache[urlToFetch];
} else {
// use the previous result
result = await fetch(/* whatever */);
// remember to also store result in cache
resultCache[urlToFetch] = result;
}
您有几个选择。
首先,您可以将 url 转换为 Set
,从而完全避免出现任何重复。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
另一种选择是将 return 存储在一个对象中,键为 url 并在您的 if 语句中检查该值是否不为空。
*** 使用集合更新 ***
/* urlToValidate is a list of URLS */
urlToValidate = ["ups.com", "redfin.com", "ups.com", "redfin.com", "redfin.com", "redfin.com"];
var urls = new Set(urlToValidate);
var isValid = false;
/* API Overview https://www.ipqualityscore.com/documentation/malicious-url-scanner-api/overview */
for (let i = 0; i < urls.length; i++) {
$.getJSON('https://ipqualityscore.com/api/json/url/<API_KEY>/' + urls[i], function( json ) {
if (!json.phishing && !json.spamming && json.risk_score < 80) {
isValid = true;
returnMessage(isValid, json.risk_score, i)
} else {
isValid = false;
returnMessage(isValid, json.risk_score, i)
}
});
}
}