JavaScript - 如何等待/ SetTimeOut /睡眠/延迟

Ash*_*Ash 5 javascript delay

这又是我的Rock Paper Scissors游戏.

在目前状态下,用户无法看到发生了什么,因为在提示输入(Rock,Paper或Scissors)后,他们立即被重新提供.

问题是如何使程序延迟,以便它们至少可以读取正在发生的事情.

我已经读过JavaScript中不存在sleep().我正在尝试使用setTimeOut,但是setTimeOut导致程序无法运行.

关于如何在第一次用户输入后延迟下一个用户输入的任何想法.这可以通过任何JS解决方案完成.

这是我现在的代码

function playUntil(rounds) {
        var playerWins = 0;
        var computerWins = 0;
        setTimeout(function() {
        while ((playerWins < rounds) && (computerWins < rounds)) {
          var computerMove = getComputerMove();
          var winner = getWinner(playerMove, computerMove);
          console.log('The player has chosen ' + playerMove + '. The computer has chosen ' + computerMove);
          if (winner === "Player") {
              playerWins += 1; 
          } 
          else if (winner === "Computer") {
              computerWins += 1;
          } 
          if ((playerWins == rounds) || (computerWins == rounds)) {
              console.log("The game is over! The " + winner + " has taken out the game!");
              console.log("The final score was Player - [" + playerWins + "] to Computer - [" + computerWins + "]");
          }
          else {
              console.log(winner + ' takes the round. It is now ' + playerWins + ' to ' + computerWins);
          }
          }
      return [playerWins, computerWins]
    ;},5000);
    }
Run Code Online (Sandbox Code Playgroud)

jgd*_*dev 7

您不能在setTimeout,setInterval或其他子函数上返回父函数的值,因为它具有不同的范围.

您可以使用promises:https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

坏:

function x () {
  setTimeout(function () {
     return "anything";
  }, 5000);
}
Run Code Online (Sandbox Code Playgroud)

使用承诺:

function x () {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve("anything");
    }, 5000);
  });
}
Run Code Online (Sandbox Code Playgroud)

然后你可以调用函数:

x()
.then(
  function (result) {
    alert(result); // Do anything.
  }
);
Run Code Online (Sandbox Code Playgroud)

PD:我的英语不好,对不起!


Ash*_*tit -13

这花了我很长时间才弄清楚,但这就是解决方案。

创建这个函数

function sleep(miliseconds) {
    var currentTime = new Date().getTime();
    while (currentTime + miliseconds >= new Date().getTime()) {
    }
}
Run Code Online (Sandbox Code Playgroud)

将其添加到我想要延迟的代码中

sleep(3000)
Run Code Online (Sandbox Code Playgroud)

  • 请不要这样做 - 它会在睡眠时冻结整个页面。 (23认同)