AJAX请求的Javascript解析

AJAX请求的Javascript解析,javascript,json,ajax,Javascript,Json,Ajax,背景:在下面的客户端脚本中,AJAX请求被发送到服务器,从服务器上的JSON文件获取数据。首选方法是发送一个请求以获取页面上所需的所有数据,而不是在整个页面中发送多个单独的数据请求 问题:因为AJAX请求是异步运行的,所以页面加载时会运行页面底部的alert#2,而页面加载后会运行请求中的alert#1。因此,警报#2中game.game_nb的值为“未定义”,而警报#1中game.game_nb的值包含有效数据。请注意,游戏对象具有功能范围 问题:如何配置AJAX请求,以便在加载页面时警报#2

背景:在下面的客户端脚本中,AJAX请求被发送到服务器,从服务器上的JSON文件获取数据。首选方法是发送一个请求以获取页面上所需的所有数据,而不是在整个页面中发送多个单独的数据请求

  • 问题:因为AJAX请求是异步运行的,所以页面加载时会运行页面底部的alert#2,而页面加载后会运行请求中的alert#1。因此,警报#2中game.game_nb的值为“未定义”,而警报#1中game.game_nb的值包含有效数据。请注意,游戏对象具有功能范围

  • 问题:如何配置AJAX请求,以便在加载页面时警报#2有一个值?我知道,一种方法是,每当页面需要来自游戏对象的数据时,都有一个AJAX请求。基于性能考虑和代码可读性,我不希望这样做。我已经查阅了stackoverflow的其他答案,但似乎没有一个能解决这个具体问题

  • 感谢您的任何想法或建议

    { // loadGame
      var request = new XMLHttpRequest();
      path = setHTTPRequestPath( "loadGame" );
      request.open("POST", path, true);
      request.setRequestHeader("header_nb", "108"); 
      request.setRequestHeader("header_nm", "loadGame");
      request.setRequestHeader("game_nb", gameNumber);
      request.setRequestHeader( "Content-Type", "application/json; charset=UTF-8" );
      request.send(null);
      request.onreadystatechange = function()
      {
        if (( request.readyState === 4 ) && ( request.status === 200 ))
        {
          game = JSON.parse(request.responseText, "utf8");
          alert("alert #1: " + game.game_nb );
        }
      }
    } // eofcb
    
    alert("alert #2: " + game.game_nb );
    

    正如您自己所说,JSON文件驻留在服务器上,game.game\u nb作为请求的结果填充。因此,在警报#2时不会得到结果,因为此时ajax请求仍在处理中

    ajax调用完成后,将调用,onreadystatechange的动态函数,为警报#1提供正确的结果

    请记住,代码段中的顺序是:

    • 发送ajax请求
    • 执行警报#2(无值)
    • 收到回复
    • 执行警报#1(带值)

    我有点困惑。如果
    game.game\u nb
    是你只能从服务器上获得的东西,那么在加载页面时它怎么会有值呢?这让我们两个人都感到困惑。英雄联盟游戏对象来源于服务器上的JSON文件。Game_nb是对象中的几个属性之一。当请求完成时,如所附代码中所述,将根据请求填充game.game_nb。这回答了你的问题吗?我应该指出,game.game#nb填充在alert#1中,而不是填充在alert#2中,这是我问题的基础……你能用简单的英语告诉我你想用alert#2做什么吗?您是否只想弹出“正在加载…”之类的内容,然后在加载时弹出“1”警报?1。不,这不是我问题的目的。谢谢你的澄清。对于我们这些新手来说,异步编码确实需要一点时间来适应。干杯,伙计……是的,一开始可能看起来有点复杂:)