{"id":1131,"date":"2016-12-19T10:45:56","date_gmt":"2016-12-19T01:45:56","guid":{"rendered":"http:\/\/belliny.net\/?p=1131"},"modified":"2016-12-19T10:45:56","modified_gmt":"2016-12-19T01:45:56","slug":"node-js-custom-callback-function-declare","status":"publish","type":"post","link":"https:\/\/www.belliny.net\/?p=1131","title":{"rendered":"Node.JS custom Callback function declare"},"content":{"rendered":"<p>http:\/\/stackoverflow.com\/questions\/2190850\/create-a-custom-callback-in-javascript<\/p>\n<table>\n<tbody>\n<tr>\n<td class=\"votecell\">\n<div class=\"vote\"><span class=\"vote-count-post \">421<\/span><a class=\"vote-down-off\" title=\"This answer is not useful\">down vote<\/a><span class=\"vote-accepted-on load-accepted-answer-date\" title=\"loading when this answer was accepted...\">accepted<\/span><\/div>\n<\/td>\n<td class=\"answercell\">\n<div class=\"post-text\">\n<p>Actually, your code will pretty much work as is, just declare your callback as an argument and you can call it directly using the argument name.<\/p>\n<h3>The basics<\/h3>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"kwd\">function<\/span><span class=\"pln\"> doSomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"com\">\/\/ ...<\/span>\n\n    <span class=\"com\">\/\/ Call the callback<\/span><span class=\"pln\">\n    callback<\/span><span class=\"pun\">(<\/span><span class=\"str\">'stuff'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'goes'<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'here'<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">function<\/span><span class=\"pln\"> foo<\/span><span class=\"pun\">(<\/span><span class=\"pln\">a<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> b<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> c<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"com\">\/\/ I'm the callback<\/span><span class=\"pln\">\n    alert<\/span><span class=\"pun\">(<\/span><span class=\"pln\">a <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> b <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> c<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span><span class=\"pln\">\n\ndoSomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">foo<\/span><span class=\"pun\">);<\/span><\/code><\/pre>\n<p>That will call\u00a0<code>doSomething<\/code>, which will call\u00a0<code>foo<\/code>, which will alert &#8220;stuff goes here&#8221;.<\/p>\n<p>Note that it&#8217;s very important to pass the function\u00a0<em>reference<\/em>\u00a0(<code>foo<\/code>), rather than calling the function and passing its result (<code>foo()<\/code>). In your question, you do it properly, but it&#8217;s just worth pointing out because it&#8217;s a common error.<\/p>\n<h3>More advanced stuff<\/h3>\n<p>Sometimes you want to call the callback so it sees a specific value for\u00a0<code>this<\/code>. You can easily do that with the JavaScript\u00a0<code>call<\/code>\u00a0function:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"kwd\">function<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> name<\/span><span class=\"pun\">;<\/span>\n<span class=\"pun\">}<\/span>\n<span class=\"typ\">Thing<\/span><span class=\"pun\">.<\/span><span class=\"pln\">prototype<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"com\">\/\/ Call our callback, but using our own instance as the context<\/span><span class=\"pln\">\n    callback<\/span><span class=\"pun\">.<\/span><span class=\"pln\">call<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">this<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">function<\/span><span class=\"pln\"> foo<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\n    alert<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">var<\/span><span class=\"pln\"> t <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Joe'<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\nt<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">foo<\/span><span class=\"pun\">);<\/span>  <span class=\"com\">\/\/ Alerts \"Joe\" via `foo`<\/span><\/code><\/pre>\n<p>You can also pass arguments:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"kwd\">function<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> name<\/span><span class=\"pun\">;<\/span>\n<span class=\"pun\">}<\/span>\n<span class=\"typ\">Thing<\/span><span class=\"pun\">.<\/span><span class=\"pln\">prototype<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> salutation<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"com\">\/\/ Call our callback, but using our own instance as the context<\/span><span class=\"pln\">\n    callback<\/span><span class=\"pun\">.<\/span><span class=\"pln\">call<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">this<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> salutation<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">function<\/span><span class=\"pln\"> foo<\/span><span class=\"pun\">(<\/span><span class=\"pln\">salutation<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\n    alert<\/span><span class=\"pun\">(<\/span><span class=\"pln\">salutation <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span> <span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">var<\/span><span class=\"pln\"> t <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Joe'<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\nt<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">foo<\/span><span class=\"pun\">,<\/span> <span class=\"str\">'Hi'<\/span><span class=\"pun\">);<\/span>  <span class=\"com\">\/\/ Alerts \"Hi Joe\" via `foo`<\/span><\/code><\/pre>\n<p>Sometimes it&#8217;s useful to pass the arguments you want to give the callback as an array, rather than individually. You can use\u00a0<code>apply<\/code>\u00a0to do that:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"kwd\">function<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"pln\">name<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> name<\/span><span class=\"pun\">;<\/span>\n<span class=\"pun\">}<\/span>\n<span class=\"typ\">Thing<\/span><span class=\"pun\">.<\/span><span class=\"pln\">prototype<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">function<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\n    <span class=\"com\">\/\/ Call our callback, but using our own instance as the context<\/span><span class=\"pln\">\n    callback<\/span><span class=\"pun\">.<\/span><span class=\"pln\">apply<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">this<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">[<\/span><span class=\"str\">'Hi'<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">3<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">2<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">1<\/span><span class=\"pun\">]);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">function<\/span><span class=\"pln\"> foo<\/span><span class=\"pun\">(<\/span><span class=\"pln\">salutation<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> three<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> two<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> one<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\n    alert<\/span><span class=\"pun\">(<\/span><span class=\"pln\">salutation <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span> <span class=\"kwd\">this<\/span><span class=\"pun\">.<\/span><span class=\"pln\">name <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" - \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> three <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> two <\/span><span class=\"pun\">+<\/span> <span class=\"str\">\" \"<\/span> <span class=\"pun\">+<\/span><span class=\"pln\"> one<\/span><span class=\"pun\">);<\/span>\n<span class=\"pun\">}<\/span>\n\n<span class=\"kwd\">var<\/span><span class=\"pln\"> t <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">Thing<\/span><span class=\"pun\">(<\/span><span class=\"str\">'Joe'<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\nt<\/span><span class=\"pun\">.<\/span><span class=\"pln\">doSomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">foo<\/span><span class=\"pun\">);<\/span>  <span class=\"com\">\/\/ Alerts \"Hi Joe - 3 2 1\" via `foo`<\/span><\/code><\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<tbody>\n<tr>\n<td class=\"votecell\">\n<div class=\"vote\"><a class=\"vote-down-off\" title=\"This answer is not useful\">down vote<\/a><\/div>\n<\/td>\n<td class=\"answercell\">\n<div class=\"post-text\">\n<p>It is good practice to make sure the callback is an actual function before attempting to execute it:<\/p>\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">callback <\/span><span class=\"pun\">&amp;&amp;<\/span> <span class=\"kwd\">typeof<\/span><span class=\"pun\">(<\/span><span class=\"pln\">callback<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">===<\/span> <span class=\"str\">\"function\"<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span><span class=\"pln\">\n\n  callback<\/span><span class=\"pun\">();<\/span>\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>My 2 cent. Same but different&#8230;<\/p>\n<div class=\"post-text\">\n<pre class=\"default prettyprint prettyprinted\"><code><span class=\"tag\">&lt;script&gt;<\/span><span class=\"pln\">\n    dosomething<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"blaha\"<\/span><span class=\"pun\">,<\/span> <span class=\"kwd\">function<\/span><span class=\"pun\">(){<\/span><span class=\"pln\">\n        alert<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"Yay just like jQuery callbacks!\"<\/span><span class=\"pun\">);<\/span>\n    <span class=\"pun\">});<\/span>\n\n\n    <span class=\"kwd\">function<\/span><span class=\"pln\"> dosomething<\/span><span class=\"pun\">(<\/span><span class=\"pln\">damsg<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> callback<\/span><span class=\"pun\">){<\/span><span class=\"pln\">\n        alert<\/span><span class=\"pun\">(<\/span><span class=\"pln\">damsg<\/span><span class=\"pun\">);<\/span>\n        <span class=\"kwd\">if<\/span><span class=\"pun\">(<\/span><span class=\"kwd\">typeof<\/span><span class=\"pln\"> callback <\/span><span class=\"pun\">==<\/span> <span class=\"str\">\"function\"<\/span><span class=\"pun\">)<\/span><span class=\"pln\"> \n        callback<\/span><span class=\"pun\">();<\/span>\n    <span class=\"pun\">}<\/span>\n<span class=\"tag\">&lt;\/script&gt;<\/span><\/code><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>http:\/\/stackoverflow.com\/questions\/2190850\/create-a-custom-callback-in-javascript 421down voteaccepted Actually, your code will pretty much work as is, just declare your callback as an argument and you can call it directly using the argument name. The basics function doSomething(callback) { \/\/ &#8230; \/\/ Call the callback callback(&#8216;stuff&#8217;, &#8216;goes&#8217;, &#8216;here&#8217;); } function foo(a, b, c) { \/\/ I&#8217;m the callback alert(a + &hellip; <a href=\"https:\/\/www.belliny.net\/?p=1131\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Node.JS custom Callback function declare&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[10],"tags":[],"class_list":["post-1131","post","type-post","status-publish","format-standard","hentry","category-node-js"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.belliny.net\/index.php?rest_route=\/wp\/v2\/posts\/1131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.belliny.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.belliny.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.belliny.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.belliny.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1131"}],"version-history":[{"count":0,"href":"https:\/\/www.belliny.net\/index.php?rest_route=\/wp\/v2\/posts\/1131\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.belliny.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.belliny.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.belliny.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}