[英]Javascript program not executing correctly
我是javascript新手,但是我无法解决这个问题。 我有一个支持游戏的功能:
function upVoteGame(name) {
$.get("/get_gameValues", function(data) {
var alreadyExist = false;
var noVotes = false;
var games;
games = data;
for (var i = 0; i < games.length; i++) {
if (name === games[i].gameName) {
alreadyExist = true;
voteOperations();
if (userLoggedIn == false) {
alert("second");
swal("Cannot post votes", "Please log in or register to vote", "error");
}
if (noVotesLeft == false && userLoggedIn == true) {
$.ajax({
url: '/editVotes/' + games[i]._id,
type: 'PUT',
data: {
likes: games[i].likes + 1,
totalVotes: data[i].totalVotes + 1
},
success: function(result) {
alert(games[i].likes + 1);
}
});
}
refreshGameValues();
break;
}
}
//This is for us Developers!
if (!alreadyExist) {
$.post("/add_game_to_dB", {
gameName: name
}, function(result) {
alert("Introduced " + name);
});
}
});
}
现在,我有一个更新用户剩余投票的功能voteOperations():
function voteOperations() {
$.get("/users/get_current_user", function(data) {
//var votes = 5;
for (var i = 0; i < data.length; i++) {
votesRemaining = data[i].votesRemaining;
userLoggedIn = true;
alert("votes left : " + votesRemaining);
if ((votesRemaining - 1) < 0) {
swal("No votes remaining", "Please wait 24 hours to get more votes", "error");
noVotesLeft = true;
}
if (noVotesLeft == false) {
$.ajax({
url: '/users/updateUserDetails/' + data[i].user_name,
type: 'PUT',
data: {
votesRemaining: votesRemaining - 1
},
success: function(result) {}
});
}
}
});
}
我的问题是一个简单的问题。 在upVoteGame(name)函数中,我希望voteOperations()在其下面的if循环之前执行。 但是,当我运行代码时,下面的if循环首先执行,并警告用户他们尚未登录。当用户登录时,userLoggedIn设置为true,但是if循环首先执行并告诉他们未登录登录,然后执行voteOperations()函数。 我不知道为什么会这样。 我该如何解决这个问题,以使表决操作在if循环之前执行?
这是因为表决操作函数具有一个异步的get请求。 您将需要一个回调函数,其中应包含if条件
你可以试试:
function upVoteGame(name) {
vote(afterGet);
}
afterGet() {
if condition here
}
function vote(callback) {
$.get .... {
//after getting data
callback();
}
}
您的问题是由于在voteOperations
函数中异步调用了$.get
而voteOperations
。
由于它是一个异步调用,因此您的代码在$.get
等待检索数据时是连续的,因此if语句似乎在您的voteOperations
之前触发。
简而言之,实际上是在if语句之前触发了您的函数,但在完成之前触发了代码,并触发了if语句。
您可以将if语句(逻辑)放在您的表决操作函数的成功回调中,或将$.ajax
与async:false一起使用 ,这通常不被认为是一种好习惯,但是我有时会使用它。
例如类似的东西(对于第二种情况)
$.ajax({
async: false,
.....
success: function (response) {
//
}
});
异步调用可以用jQuery函数Deffered处理
function upVoteGame(name) {
vote().then(doUpVoteGame(), handleError());
}
function doUpVoteGame() {
...
}
function handleError(e) {
console.error("fail", e);
}
function vote() {
var d = new $.Deferred();
$.get .... {
d.resolve();
}).fail(function(e) {
d.reject(e);
});
return d;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.