Search code examples
javascriptfunctionsettimeoutes6-promise

Why Promise is not displaying the data with setTimeout?


I wrote a function to get a random number after 500 milliseconds and it worked perfectly with (return new Promise (resolve,reject)), also, it worked without it by using setTimeout() function, but when I added the promise and setTimeout() inside it wont show the result, I have console.log() before and after the result and both are showing. Please note that i am still new to the promise concept in general since this is a task from my coding school, thank you.

My code:

function getRandomNumber () {
   new Promise ((resolve,reject) =>{
      console.log('Getting Random Number...');
      let number =   Math.random();
      setTimeout( () => {
         if(number){
            resolve (`OK ${number}`);
            console.log('Done!');
         }
         else
            reject ('ERROR');
      }, 500);
   });   
 }
    
getRandomNumber();

Result:

enter image description here


Solution

  • First, return your promise, second use the result the promise provides either by creating a variable from it and awaiting it or using then

    function getRandomNumber() {
        return new Promise((resolve, reject) => {
            console.log('Getting Random Number...');
            let number = Math.random();
            setTimeout(() => {
                if (number) {
                    resolve(`OK ${number}`);
                    console.log('Done!');
                } else {
                    reject('ERROR');
                }
            }, 500);
        });
    
    }
    
    getRandomNumber().then(result => console.log(result));
    
    (async () => {
      const number = await getRandomNumber();
      console.log(number);
     })();

    Another option is to write sleep as a separate reusable function. Note async function can await multiple values and return values of their own. Calling an async function will always return a Promise -

    function sleep(time) {
      return new Promise(resolve => setTimeout(resolve, time))
    }
    
    async function getRandomNumber() {
      console.log('Getting Random Number...')
      await sleep(500)
      const number = Math.random()
      console.log("Done!")
      return number
    }
    
    async function main() {
      const number1 = await getRandomNumber()
      console.log("number1", number1)
      const number2 = await getRandomNumber()
      console.log("number1", number2)
      const number3 = await getRandomNumber()
      console.log("number1", number3)
      return number1 + number2 + number3
    }
    
    main().then(console.log, console.error)
    .as-console-wrapper { min-height: 100%; }

    Getting Random Number...
    Done!
    number1 0.2907058138817884
    Getting Random Number...
    Done!
    number1 0.05784624607512423
    Getting Random Number...
    Done!
    number1 0.889702848981964
    1.2382549089388766