使用ajax上下文不能解决范围问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ajax上下文不能解决范围问题相关的知识,希望对你有一定的参考价值。

我无法使ajax上下文工作: -

var msgdata = "";
$.ajax({
  type: "POST",
  url: "players/" + joinplayer + "/joingame.php",
  data: { 
    userID: "<?php echo $_SESSION['username']; ?>",
    gameinfo: JSON.stringify(<?php echo json_encode($_SESSION['profile']['user'], true); ?>)
  },
  context: msgdata,
  success: function(data) {
    msgdata = data;
    $.ajax({
      type: "POST",
      url: "renamejoin.php",
      data: { 
        userID: "<?php echo $_SESSION['username']; ?>",
        joinID: joinplayer
      },
      context: msgdata,
      success: function(data) {
        if (data == "" && msgdata != "") {
          // sucessfully joined a player's game
        } else {
            alert(data);
        }
      },
      error: function() {   
        alert(joinplayer + "'s game is no longer available.");
      }
    });
  },
  error: function() {
    alert(joinplayer + "'s game is no longer available.");
  }
});
if (msgdata == "");
  // start showing games awaiting players again
  gamefeedrefresh;
  timer = window.setInterval(gamefeedrefresh, 2500);
}

在最后的if语句中,msgdata总是“”。这个问题似乎是一个范围问题,但即使是一个或两个上下文语句都没有区别。

是否可以解决此范围问题?所有建议都赞赏。

答案

Ajax请求是异步的,这意味着程序的其余部分将在请求返回之前执行。如果要在请求完成后运行代码,请将其移动到success函数体中。

您可能还想看看Promise

另一答案

如果要在继续阅读脚本之前强制浏览器先完成执行请求,只需在ajax方法中添加async选项并将其设置为false

async: false
另一答案

一旦考虑了异步性,整体解决方案就不会太复杂。

主要问题是为错误出口创建函数,然后等待第二次成功被触发以使用来自第一个ajax调用的msgdata,该调用始终在范围内,但仅在第二个ajax的成功触发器上有效。

joinfailed函数可以是内联的,以便joinplayer仍然在范围内,但我无法决定将它放在哪个错误出口,所以我决定将它保持独立。

$("#gamefeed").on('click', ".chooseGame", function (evnt) {
  $.ajax({
    type: "POST",
    url: "players/" + joinplayer + "/joingame.php",
    data: { 
      userID: "<?php echo $_SESSION['username']; ?>",
      gameinfo: JSON.stringify(<?php echo json_encode($_SESSION['profile']['user'], true); ?>)
    },
    success: function(data) {
      msgdata = data;
      $.ajax({
        type: "POST",
        url: "renamejoin.php",
        data: { 
          userID: "<?php echo $_SESSION['username']; ?>",
          joinID: joinplayer
        },
        success: function(data) {
          if (data != "") {
            joinfailed(joinplayer);
          } else {
            alert(msgdata); // "you joined joinplayer's game"
            // initialise comms and join the game
          }
        },
        error: function() {   
          joinfailed(joinplayer);
        }
      });
    },
    error: function() {
      joinfailed(joinplayer);
    }
  });
});
function joinfailed(joinplayer) {
  alert(joinplayer + "'s game is no longer available.");
  // start showing games awaiting players again
  gamefeedrefresh;
  timer = window.setInterval(gamefeedrefresh, 2500);
}

以上是关于使用ajax上下文不能解决范围问题的主要内容,如果未能解决你的问题,请参考以下文章

AJAX相关JS代码片段和部分浏览器模型

片段无法转换为上下文

BootStrap有用代码片段(持续总结)

片段活动中的 ListView 适配器上下文错误,我该怎么办?

片段活动错误中的ListView Adapter上下文,我该怎么办?

BootStrap实用代码片段(持续总结)