Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a custom callback in JavaScript

All I need to do is to execute a callback function when my current function execution ends.

function LoadData()  {     alert('The data has been loaded');     //Call my callback with parameters. For example,     //callback(loadedData , currentObject); } 

A consumer for this function should be like this:

object.LoadData(success);  function success(loadedData , currentObject)  {   //Todo: some action here  } 

How do I implement this?

like image 307
Amgad Fahmi Avatar asked Feb 03 '10 09:02

Amgad Fahmi


People also ask

What is callback () in JavaScript?

A JavaScript callback is a function which is to be executed after another function has finished execution. A more formal definition would be - Any function that is passed as an argument to another function so that it can be executed in that other function is called as a callback function.

How do you pass a callback function in JavaScript?

Passing a function to another function or passing a function inside another function is known as a Callback Function. Syntax: function geekOne(z) { alert(z); } function geekTwo(a, callback) { callback(a); } prevfn(2, newfn);

Is callback a keyword in JavaScript?

For your top function, callback is the name of the third argument; it expects this to be a function, and it is provided when the method is called. It's not a language keyword - if you did a "find/replace all" of the word "callback" with "batmanvsuperman", it would still work.


2 Answers

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) {     // ...      // Call the callback     callback('stuff', 'goes', 'here'); }  function foo(a, b, c) {     // I'm the callback     alert(a + " " + b + " " + c); }  doSomething(foo); 

That will call doSomething, which will call foo, which will alert "stuff goes here".

Note that it's very important to pass the function reference (foo), rather than calling the function and passing its result (foo()). In your question, you do it properly, but it's just worth pointing out because it's a common error.

More advanced stuff

Sometimes you want to call the callback so it sees a specific value for this. You can easily do that with the JavaScript call function:

function Thing(name) {     this.name = name; } Thing.prototype.doSomething = function(callback) {     // Call our callback, but using our own instance as the context     callback.call(this); }  function foo() {     alert(this.name); }  var t = new Thing('Joe'); t.doSomething(foo);  // Alerts "Joe" via `foo` 

You can also pass arguments:

function Thing(name) {     this.name = name; } Thing.prototype.doSomething = function(callback, salutation) {     // Call our callback, but using our own instance as the context     callback.call(this, salutation); }  function foo(salutation) {     alert(salutation + " " + this.name); }  var t = new Thing('Joe'); t.doSomething(foo, 'Hi');  // Alerts "Hi Joe" via `foo` 

Sometimes it's useful to pass the arguments you want to give the callback as an array, rather than individually. You can use apply to do that:

function Thing(name) {     this.name = name; } Thing.prototype.doSomething = function(callback) {     // Call our callback, but using our own instance as the context     callback.apply(this, ['Hi', 3, 2, 1]); }  function foo(salutation, three, two, one) {     alert(salutation + " " + this.name + " - " + three + " " + two + " " + one); }  var t = new Thing('Joe'); t.doSomething(foo);  // Alerts "Hi Joe - 3 2 1" via `foo` 
like image 158
T.J. Crowder Avatar answered Oct 04 '22 00:10

T.J. Crowder


It is good practice to make sure the callback is an actual function before attempting to execute it:

if (callback && typeof(callback) === "function") {    callback(); } 
like image 41
Donald A Nummer Jr Avatar answered Oct 04 '22 01:10

Donald A Nummer Jr