【问题标题】:Because I only see the last element of the for loop因为我只看到for循环的最后一个元素
【发布时间】:2022-01-11 15:37:49
【问题描述】:

我遇到了问题;我有以下程序代码:

var xmlhttp = new XMLHttpRequest();
var url = "https://wjko5k6250.execute-api.us-east-2.amazonaws.com/motorcycle"; 
xmlhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {
   var allmot = JSON.parse(this.responseText);
   console.log(allmot);
    for(var i = 0, len = allmot.Items.length; i < len; i++)
    {
      id=allmot.Items[i].id
      var url1 = "https://wjko5k6250.execute-api.us-east-2.amazonaws.com/motorcycle/"+id; 
      console.log(url1);
      xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          var myArr = JSON.parse(this.responseText);
          console.log(myArr);
          document.getElementById("img").src = myArr.Item.image;
          document.getElementById("brd").innerHTML = myArr.Item.brand;  
        }
      };
      xmlhttp.open("GET", url1, true);
      xmlhttp.send();
    }
  }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();

allmot如下:

Items: Array (4)
0: {brand: 'Guzzi', id: '123456', image: 'moto_guzzi.jpg', date: '27/11/2021 '}
1: {brand: 'Bimota', id: '135623', image: 'bimota.jpg', date: '04/12/2021 '}
2: {brand: 'Ducati', id: '123789', image: 'b_desertx.jpg', date: ' 04/12/2021 '}
3: {brand: 'Benelli', id:' 146975 ', image:' benelli.jpg ', date: '27/11/2021'}

url1 返回(根据 for 循环):

https://wjko5k6250.execute-api.us-east-2.amazonaws.com/articles/123456
https://wjko5k6250.execute-api.us-east-2.amazonaws.com/articles/135623
https://wjko5k6250.execute-api.us-east-2.amazonaws.com/articles/123789
https://wjko5k6250.execute-api.us-east-2.amazonaws.com/articles/146975

到目前为止,一切似乎都很好。

问题出在myArr;我注意到它只返回最后一个元素的图像和品牌,所以它的 id 等于 146975。

因此,for 循环似乎存在问题。

谁能帮帮我?谢谢大家。

【问题讨论】:

  • 您到底希望得到什么?我的意思是你一遍遍设置#img的src和#brd的内容,最终的结果肯定是最后一次设置的值。
  • 对于每一个我想获得的形象和品牌。它只对最后一个元素这样做
  • 但是您只有一个图像和其他元素。 document.getElementById 仅从 DOM 中找到具有传递的 id 的第一个元素。如果您有多个具有相同id 的元素,那将不起作用。还要注意 pid 的回答。
  • 我在@pid的回答下面回答了

标签: javascript loops for-loop


【解决方案1】:

作为第一次更正,我不会在内循环的外循环中回收 XHR 对象。

当你在内循环中说xmlhttp.onreadystatechange = function() ...时,xmlhttp已经在readystate中,在外循环中获得。

因此,无需进一步检查发生了什么,我将使用两个 XHR 对象(可能像 outerXmlhttpinnerXmlhttp)。我还会为每个循环重新创建内部 XHR:

var innerXmlhttp;

在外部封闭的顶部。

然后,在循环里面做:

innerXmlhttp = new XMLHttpRequest();

这是因为可变提升。如果你这样做:

var innerXmlhttp = new XMLHttpRequest();

在循环中,您可能会得到不同的行为。只是不要这样做并写下你的意思(提升变量并将它们分配到你真正需要的地方)。

如果所有这些还不够,请提出一个新的、更准确的问题来了解正在发生的事情。

这是您的更正代码:

var outerXmlhttp = new XMLHttpRequest();
var url = "https://wjko5k6250.execute-api.us-east-2.amazonaws.com/motorcycle"; 
outerXmlhttp.onreadystatechange = function() {
  var innerXmlhttp;

  if (this.readyState == 4 && this.status == 200) {
   var allmot = JSON.parse(this.responseText);
   console.log(allmot);
    for(var i = 0, len = allmot.Items.length; i < len; i++)
    {
      id=allmot.Items[i].id
      var url1 = "https://wjko5k6250.execute-api.us-east-2.amazonaws.com/motorcycle/"+id; 
      console.log(url1);

      innerXmlhttp = new XMLHttpRequest();
      innerXmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
          var myArr = JSON.parse(this.responseText);
          console.log(myArr);
          document.getElementById("img").src = myArr.Item.image;
          document.getElementById("brd").innerHTML = myArr.Item.brand;  
        }
      };
      innerXmlhttp.open("GET", url1, true);
      innerXmlhttp.send();
    }
  }
};
outerXmlhttp.open("GET", url, true);
outerXmlhttp.send();

编辑:@Teemu 的鹰眼

正如@Teemu 在他的评论中指出的那样,如果您像这样反复将值重新分配给相同的 DOM 对象:

document.getElementById("img").src = myArr.Item.image;
document.getElementById("brd").innerHTML = myArr.Item.brand;  

你显然覆盖了之前的任何值。相反,您应该创建并附加这些 DOM 对象,更像这样:

var img = document.createElement("img");
img.src = myArr.Item.image;
var brd = document.createElement("p");
brd.innerText = myArr.Item.brand;
document.getElementById("motlist").append(img);
document.getElementById("motlist").append(brd);

显然,您需要一个 &lt;div id="motlist"&gt;&lt;/div&gt; 元素或 DOM 中的其他父元素来附加新元素。

对于分页,您可能还想清除列表中的那些元素...但在这里我们太过分了。

【讨论】:

  • 我只回答一个问题。事实上,我理解@Teemu 的意思,但我需要通过 for 循环获得每辆摩托车的每张图片和每一个品牌。我需要弄清楚如何做到这一点。你能帮我提供一个完整的代码吗?
  • 我只需要两个div,一个用于品牌,另一个用于图像
  • 以上代码足以指导您编写自己的代码。我不会为你写代码,否则你不会从作业中学到任何东西。
  • 不,我不是那个意思。由于我是初学者,如果我已经有document.getElementById("img").src = myArr.Item.image;,我该如何输入document.getElementById("motlist").append(img);
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多