Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I pass a parameter to a setTimeout() callback?

I have some JavaScript code that looks like:

function statechangedPostQuestion() {   //alert("statechangedPostQuestion");   if (xmlhttp.readyState==4)   {     var topicId = xmlhttp.responseText;     setTimeout("postinsql(topicId)",4000);   } }  function postinsql(topicId) {   //alert(topicId); } 

I get an error that topicId is not defined Everything was working before I used the setTimeout() function.

I want my postinsql(topicId) function to be called after some time. What should I do?

like image 585
Zeeshan Rang Avatar asked Jul 27 '09 21:07

Zeeshan Rang


People also ask

How do I set callback in setTimeout?

Introduction to JavaScript setTimeout() The setTimeout() sets a timer and executes a callback function after the timer expires. In this syntax: cb is a callback function to be executed after the timer expires. delay is the time in milliseconds that the timer should wait before executing the callback function.

How many parameters does a setTimeout f unction accept?

Developers generally pass only two parameters to setTimeout method — the callback function and the timeout period.

What is the first parameter that a setTimeout function accepts?

The setTimeout() function accepts two arguments. The first argument is a function and the second argument is time in milliseconds.


2 Answers

setTimeout(function() {     postinsql(topicId); }, 4000) 

You need to feed an anonymous function as a parameter instead of a string, the latter method shouldn't even work per the ECMAScript specification but browsers are just lenient. This is the proper solution, don't ever rely on passing a string as a 'function' when using setTimeout() or setInterval(), it's slower because it has to be evaluated and it just isn't right.

UPDATE:

As Hobblin said in his comments to the question, now you can pass arguments to the function inside setTimeout using Function.prototype.bind().

Example:

setTimeout(postinsql.bind(null, topicId), 4000); 
like image 200
meder omuraliev Avatar answered Sep 21 '22 17:09

meder omuraliev


In modern browsers (ie IE11 and beyond), the "setTimeout" receives a third parameter that is sent as parameter to the internal function at the end of the timer.

Example:

var hello = "Hello World"; setTimeout(alert, 1000, hello);

More details:

  • https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout
  • http://arguments.callee.info/2008/11/10/passing-arguments-to-settimeout-and-setinterval/
like image 25
Fabio Phms Avatar answered Sep 22 '22 17:09

Fabio Phms