我是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循环之前执行voteOperations?
答案 0 :(得分:3)
这是因为voteoperations函数有一个异步的get请求。你需要一个回调函数,你应该包括if条件
您可以尝试:
function upVoteGame(name) {
vote(afterGet);
}
afterGet() {
if condition here
}
function vote(callback) {
$.get .... {
//after getting data
callback();
}
}
答案 1 :(得分:1)
由于Ram,67
功能中private string GetAlphaNumericRandomString(int length)
{
string randomString = "";
while (randomString.Length < length)
{
//generates a random string, of twice the length specified, to counter the
//probability of the while loop having to run a second time
randomString += Membership.GeneratePassword(length * 2, 0);
//replace non alphanumeric characters
randomString = Regex.Replace(randomString, @"[^a-zA-Z0-9]", m => "");
}
return randomString.Substring(0, length);
}
的异步调用,您会出现问题。
由于它是异步调用,因此当$.get
等待检索数据时,代码会连续,因此if语句似乎在voteOperations
函数之前触发。
简单来说,你的函数实际上是在if语句之前被触发但在它完成之前结果代码继续并触发你的if语句。
您可以将if语句(逻辑)放在投票操作函数的成功回调中,或者将$.get
与async:false一起使用,这通常不被认为是一种好习惯,但我有时会使用它。
例如那样的东西(对于第二种情况)
voteOperations
答案 2 :(得分:0)
可以使用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;
}