Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript Callback timeout

I have a fiddle here

Can someone help me understand why the first setTimeout works but not on second one? Please see comments on the code.

In this case, I want to alert first I am first then after 6 seconds, it would alert Hello, sorry I am late

function iAmTakingTooLong(message1, message2, callback){       
    //setTimeout(function(){ alert('test'); },6000); //THIS WILL WAIT FOR 6000 MILLISECONDS
    setTimeout(callback(message1+message2),6000);    //THIS WILL NOT WAIT FOR 6000 MILLISECONDS
}


iAmTakingTooLong('Hello, ', 'sorry I am late!', function(fullmessage){
    alert(fullmessage);
});

alert("I am first!");
like image 816
JunM Avatar asked Mar 27 '14 14:03

JunM


1 Answers

In this code:

setTimeout(callback(message1+message2),6000);

you're calling the callback function right there in the argument list. JavaScript evaluates function arguments before calling the function, so what actually gets passed to setTimeout() here is whatever the callback function returns.

You need something like:

setTimeout(function() { callback(message1 + message2); }, 6000);

The behavior here is not unique to JavaScript.

like image 190
Pointy Avatar answered Sep 24 '22 22:09

Pointy