Get return value from setTimeout

JavascriptReturnSettimeoutReturn Value

Javascript Problem Overview


I just want to get the return value from setTimeout but what I get is a whole text format of the function?

function x () {
    setTimeout(y = function () {
        return 'done';
    }, 1000);
    return y;
}

console.log(x());

Javascript Solutions


Solution 1 - Javascript

You need to use Promises for this. They are available in ES6 but can be polyfilled quite easily:

function x() {
   var promise = new Promise(function(resolve, reject) {
     window.setTimeout(function() {
       resolve('done!');
     });
   });
   return promise;
}

x().then(function(done) {
  console.log(done); // --> 'done!'
});

With async/await in ES2017 it becomes nicer if inside an async function:

async function() {
  const result = await x();
  console.log(result); // --> 'done!';
}

Solution 2 - Javascript

You can't get a return value from the function you pass to setTimeout.

The function that called setTimeout (x in your example) will finish executing and return before the function you pass to setTimeout is even called.

Whatever you want to do with the value you get, you need to do it from the function you pass to setTimeout.

In your example, that would be written as:

function x () {
    setTimeout(function () {
        console.log("done");
    }, 1000);
}

x();

Solution 3 - Javascript

Better to take a callback for function x and whatever task you want to perform after that timeout send in that callback.

function x (callback) {
    setTimeout(function () {
        callback("done");
    }, 1000);
}

x(console.log.bind(console)); //this is special case of console.log
x(alert) 

Solution 4 - Javascript

You can use a combination of Promise and setTimeOut like the example below

let f1 = function(){
    return new Promise(async function(res,err){
        let x=0;
        let p = new Promise(function(res,err){
            setTimeout(function(){
                x= 1;
                res(x);
            },2000)
        })
        p.then(function(x){
            console.log(x);
            res(x);
        })
        
        
    });
}

Solution 5 - Javascript

I think you want have flag to know event occured or no. setTimeout not return a value. you can use a variable to detect event occured or no

var y="notdone";
   setTimeout(function () {
         y="done";
    }, 1000);

You can access variable y after timeout occured to know done or not

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionVainglory07View Question on Stackoverflow
Solution 1 - JavascriptMatt ClarksonView Answer on Stackoverflow
Solution 2 - JavascriptQuentinView Answer on Stackoverflow
Solution 3 - JavascriptMritunjayView Answer on Stackoverflow
Solution 4 - JavascriptSatyabrata SahaView Answer on Stackoverflow
Solution 5 - Javascripttuan huynhView Answer on Stackoverflow