13

This again is my Rock Paper Scissors game.

At present state the user can't see what's happening because after being prompted for input(Rock, Paper or Scissors) they are immediately reprompted.

The question is how can I make the program delay such that they at least can read what's going on.

I've read that sleep() does not exist in JavaScript. I'm trying to use setTimeOut however, the setTimeOut is causing the program to not run.

Any ideas on how I can delay the next user input after the first user input. This can be done via any JS solution.

This is my present code

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);
    }
Ash
  • 217
  • 1
  • 2
  • 8

2 Answers2

23

You cannot return a value for a parent function on a setTimeout, setInterval or another child function because have different scopes.

You can use promises instead: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Bad:

function x () {
  setTimeout(function () {
     return "anything";
  }, 5000);
}

Using promises:

function x () {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve("anything");
    }, 5000);
  });
}

Then you can call function like:

x()
.then(
  function (result) {
    alert(result); // Do anything.
  }
);

PD: I have bad English, I'm sorry!.

jgdev
  • 509
  • 3
  • 7
  • Thanks jgdev, I'm just checking this solution now! :) – Ash Feb 22 '16 at 01:07
  • While promises are a good idea, they are a new feature in ECMAScript 2015 so not supported in a good many browsers in use (including IE). *setTimeout* and *setInterval* work everywhere. – RobG Feb 22 '16 at 01:31
  • Yes sorry I looked into this and people don't recommend it. Sorry jgdev. I really appreciate the idea though! I'm still trying to work out how setTimeout or setInterval would work – Ash Feb 22 '16 at 03:47
  • You can use polyfill for those browsers (although by now all major browsers have support) – WorldSEnder Feb 12 '18 at 08:04
-13

This took me a long time to figure out but here was the solution.

Create this function

function sleep(miliseconds) {
    var currentTime = new Date().getTime();
    while (currentTime + miliseconds >= new Date().getTime()) {
    }
}

Add this into my code where I wanted the delay

sleep(3000)
Ash
  • 217
  • 1
  • 2
  • 8