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

Javascript 使用ajax上下文并不能解决范围问题,javascript,php,jquery,ajax,scope,Javascript,Php,Jquery,Ajax,Scope,我无法使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['prof

我无法使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);
}
var msgdata=“”;
$.ajax({
类型:“POST”,
url:“players/”+joinplayer+“/joingame.php”,
数据:{
用户ID:“”,
gameinfo:JSON.stringify()
},
背景:msgdata,
成功:功能(数据){
msgdata=数据;
$.ajax({
类型:“POST”,
url:“renamejoin.php”,
数据:{
用户ID:“”,
joinID:joinplayer
},
背景:msgdata,
成功:功能(数据){
如果(数据=“”&&msgdata!=“”){
//成功地加入玩家的游戏
}否则{
警报(数据);
}
},
错误:函数(){
警报(joinplayer+““的游戏不再可用。”);
}
});
},
错误:函数(){
警报(joinplayer+““的游戏不再可用。”);
}
});
如果(msgdata==”);
//再次开始播放等待玩家的游戏
游戏反馈刷新;
定时器=窗口设置间隔(gamefeedrefresh,2500);
}
msgdata在最后一个if语句中始终为“”。这个问题似乎是一个范围问题,但即使是一个或两个上下文语句也没有区别


是否有可能解决此范围问题?非常感谢您的建议。

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


您可能还想看一看。

如果您想强制浏览器在继续读取脚本之前先执行请求,只需在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);
}
$(“#gamefeed”).on('click',“.chooseGame”,函数(evnt){
$.ajax({
类型:“POST”,
url:“players/”+joinplayer+“/joingame.php”,
数据:{
用户ID:“”,
gameinfo:JSON.stringify()
},
成功:功能(数据){
msgdata=数据;
$.ajax({
类型:“POST”,
url:“renamejoin.php”,
数据:{
用户ID:“”,
joinID:joinplayer
},
成功:功能(数据){
如果(数据!=“”){
joinfailed(joinplayer);
}否则{
提醒(msgdata);/“您加入了joinplayer的游戏”
//初始化通信并加入游戏
}
},
错误:函数(){
joinfailed(joinplayer);
}
});
},
错误:函数(){
joinfailed(joinplayer);
}
});
});
函数joinfailed(joinplayer){
警报(joinplayer+““的游戏不再可用。”);
//再次开始播放等待玩家的游戏
游戏反馈刷新;
定时器=窗口设置间隔(gamefeedrefresh,2500);
}

context需要是一个对象,而不是一个原语-请参阅错误的建议,因为主线程上的同步xmlhttprequests已被弃用:可能是临时解决方案,但我找到了正确执行它的异步方法。这也有助于了解异步版本需要什么。我无法获得
async:false
以在这种情况下工作:-(好的观点。我明天将检查它们,因为我今天遇到了危机:-(