Friday 6 December 2019

javascript - 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 a 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?


Answer



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);

No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...