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());
You need to use Promises for this. They are available in ES6 but can be polyfilled quite easily:
function x() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('done!');
});
});
}
x().then((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!';
}
done
in my example was a promise that needs to be returned inside a setTimeout..because i cant get the returned deferred.resolve() inside setTimeout. how would it be? thank you
Commented
Jul 24, 2014 at 9:33
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();
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)
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);
})
});
}
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
x
and call that function with done.const x = async (waitMs) => new Promise((resolve) => setTimeout(() => resolve('done'), waitMs));
console.log(await x(1000));