Javascript程序未正确执行

时间:2018-04-17 09:55:12

标签: javascript jquery html

我是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?

3 个答案:

答案 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语句(逻辑)放在投票操作函数的成功回调中,或者将$.getasync: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;
}