使用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上下文不能解决范围问题的主要内容,如果未能解决你的问题,请参考以下文章
片段活动中的 ListView 适配器上下文错误,我该怎么办?