Javascript 使用ajax上下文并不能解决范围问题
我无法使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
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
以在这种情况下工作:-(好的观点。我明天将检查它们,因为我今天遇到了危机:-(