无法循环遍历数组并吐出 API 结果

Posted

技术标签:

【中文标题】无法循环遍历数组并吐出 API 结果【英文标题】:Trouble looping through an array and spitting out API results 【发布时间】:2021-07-13 06:12:24 【问题描述】:

我正在使用 NY state legislature API 并且遇到了麻烦,我为每个项目获得相同的输出(仅与数组中的第一项相关)。我检查了一下,柜台似乎确实在增加,所以我不确定为什么它没有显示所有的账单号码。

<script>
    $(document).ready(function() 
        const bills = ["A6143", "S737", "A2260", "S8455A", "A559", "S737", "A3041", "S1234"];
        var printNo = [];
        var title = [];
        var counter = 0;
        bills.forEach(function (item, index) 
            $.getJSON("https://legislation.nysenate.gov/api/3/bills/2021/" + bills[counter] + "?key=[mykeygoeshere]", function(item) 
                printNo[counter] = item.result.printNo;
                title[counter] = item.result.title;
                document.write("<p>" + printNo[counter] + ". ");
                document.write(title[counter] + "</p>");
                counter++;
            );
        );
    );
</script>

我最终要尝试的是比较所有账单的最新项目并显示最新更新的提要。 (例如,最近的两个动作可能是同一张账单。)但首先,我什至不知道如何在数组中迭代和显示标题,更不用说复杂的“动作”内容了。

这是 API 信息,但我认为这与这里无关。以防万一:https://legislation.nysenate.gov/static/docs/html/index.html

【问题讨论】:

【参考方案1】:

您正在 jquery getJson 调用的回调中更新您的计数器。所以 forEach 的每次迭代都有相同的 counter 值。

增加 forEach 函数主体中的计数器,与 getJSON 处于同一级别。

您为什么还要为网址上的 bills[counter] 烦恼?您可以在 forEach 回调函数的参数中获取每个项目。

$.getJSON("https://legislation.nysenate.gov/api/3/bills/2021/" + item...

【讨论】:

【参考方案2】:

页面加载后您不能使用document.write。它完全消除了整个页面。由于 $.getJSON 是异步的,每组 document.write 也可能会清除之前的那些

而是创建元素并插入到文档中,在您已经建立的容器中保存它们。

接下来,您可以将所有这些请求映射到一个 promise 数组,并在所有请求解决后使用 Promise.all() 处理所有结果

类似的东西:

$(document).ready(function() 
  const apiUrl = "https://legislation.nysenate.gov/api/3/bills/2021/";
  const bills = ["A6143", "S737", "A2260", "S8455A", "A559", "S737", "A3041", "S1234"];
  // array of request promises
  const requests = bills.map(bill => 
    return $.getJSON(apiUrl + bill + "?key=[mykeygoeshere]")
  );

  Promise.all(requests).then(results => 
    for (let printNo, title of results) 
      const $p = $('<p>').text(printNo + '.' + title);                  
      $('#someContainerId').append($p)
       
  ).catch(err => console.log('Oooops, one of the requests failed'));
);

【讨论】:

谢谢,这真的很有帮助。我试图弄清楚如何使用您的示例使 printNo 和 title 不被定义,因为我不能再只做 item.result.printNo。我看到它说“让 printNo, title of results”的部分,但真的不明白那行的意思?它在一个 for 循环中。也许我应该在第 6 行之后的返回承诺数组中定义这些变量? 这是一个destructuring assignment 再次感谢。我添加了“console.log(results);”并且能够看到它实际上已经抓住了我认为不是的元素。它未定义的原因一定是无关的。因此,虽然我还没有弄清楚如何到达我想去的地方,但由于我可以在控制台中看到数据,这已经解决了!

以上是关于无法循环遍历数组并吐出 API 结果的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历两个字符串数组并将它们设置为对象属性

C ++中的字符串数组无法正常工作?

JS -javascript 数组遍历的几种方式,数组或对象循环遍历的对比分析,性能使用合理使用

循环遍历 JSON 数组会给出“未定义”的结果 [重复]

foreach语句遍历数组

循环遍历数组会返回不同的 SQL 结果,具体取决于代码