javascript - 另一个内部的 Ajax 请求

标签 javascript jquery ajax loops

我正在为我的战场 1 战队制作一个网站,在这个网站上我想展示这个战队中的每个玩家以及他们的一些游戏内统计数据。 玩家列表存储在数据库中,我将从这个 api 中获取统计数据 .这意味着我将首先使用 ajax 从数据库中获取玩家列表,然后循环遍历它们以通过该循环中的第二个 ajax 调用获取玩家统计信息。

在我运行我的代码之前,这一切听起来都很有趣和游戏,有时并不是所有的请求都会成功,每当我试图显示一个显示名称时,它总是会显示上次调用的那个。

这是我的代码:

$(document).ready(function() {
  $.ajax({
    url: 'playerlist.php',
    method: 'POST',
    data: {
      playercheck: 1,
    },
    success: function(response) {
      var len = response.length;
      for (var i = 0; i < len; i++) {
        var psnid = response[i].psnid;

        // second ajax 

        var request = new XMLHttpRequest();

        request.open('GET', 'https://battlefieldtracker.com/bf1/api/Stats/BasicStats?platform=2&displayName=' + psnid);

        request.setRequestHeader('TRN-Api-Key', '125a7cbe-1bbe-45d4-9f70-3aa838fc7535');

        request.onreadystatechange = function() {
          if (this.readyState === 4 && this.status == 200) {
            console.log('Status:', this.status);
            console.log('Headers:', this.getAllResponseHeaders());
            console.log('Body:', this.responseText);
            var result = JSON.parse(request.responseText);

            console.log(result);
            $("#userTable").append(result['profile']['displayName']);
          }
        };

        request.send();

        // end second

      }
    },
    dataType: "json"
  });
});

如果你们能告诉我造成这种情况的原因并帮助我找到解决方案,那就太好了。 提前致谢!

最佳答案

这很可能是一个可变范围问题。在 JavaScript 中,带有 var 的变量声明被“提升”到包含函数的顶部。此外,变量的范围是函数,而不是 for 循环。

因此,虽然看起来每个 for 循环迭代都应该创建一个完全独立的 request 实例,但实际情况并非如此。到 onreadystatechange 事件触发时,您的 request 值可能已更改。

有两种方法可以解决这个问题。首先,使用es6 JS新的letconst变量声明,作用域不同。因此,如果您不需要它在旧版浏览器中工作,您只需将 var request 更改为 let request,它应该可以工作。

如果这不可能,您需要想出一种方法来限制您的 request 变量的“范围”,例如将您的请求代码放在一个函数中,然后从 for 循环内部调用函数。

关于javascript - 另一个内部的 Ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49970291/

相关文章:

javascript - 使用 javascript 自动提交表单是不好的做法吗?

javascript - $.ajax() 给出 [object HTMLInputElement] 而不是值

javascript - 如何将 2 个正则表达式模式合并为 1 个并在函数中使用它

javascript - 在 NodeJS 中将 K,V 对分配给 JSON 对象

javascript - 想在某个单词后拆分字符串?

javascript - 基于复选框和 div id 和类的多个过滤器

jquery - CSS 解析器/抽象器?如何将样式表转换为对象

asp.net - 尝试使用 Visual Studio 2010 和 AJAX 扩展的问题

JavaScript 使用 pubnub.time() - 代码在设置值之前进行

javascript - 在 MERN 应用程序(React 客户端)中外包 API 调用的正确方法?