繁体   English   中英

Javascript程序无法正确执行

[英]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函数中异步调用了$.getvoteOperations

由于它是一个异步调用,因此您的代码在$.get等待检索数据时是连续的,因此if语句似乎在您的voteOperations之前触发。

简而言之,实际上是在if语句之前触发了您的函数,但在完成之前触发了代码,并触发了if语句。

您可以将if语句(逻辑)放在您的表决操作函数的成功回调中,或将$.ajaxasync: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM