如何防止在 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)
       }
      });
    }
  }