COMisHARD
COMisHARD

Reputation: 923

Writing a function with a callback

Lets imagine that I have some code:

var someString = "";
function do1(){
    doA();
    doB();
}

function doA(){
    // some process that takes time and gets me a value
    someString = // the value I got in prior line

function doB(){
    //do something with someString;
}

What is the correct way to make sure somestring is defined by doB tries to use it? I think this is a situation that calls for a callback, but I'm not sure how to set it up?

Upvotes: 0

Views: 157

Answers (3)

Dinesh Verma
Dinesh Verma

Reputation: 666

function someFunctionA(callback){
  var someString = "modify me";
  callback(someString);
}

function someFunctionB(someString){
  // do something
}

function main() {
   someFunctionA(somefunctionB);
 }

Upvotes: 0

Makyen
Makyen

Reputation: 33376

I usually write these such that the function can be called with, or without, the callback function. You can do this by calling the callback function only if typeof callback === 'function'. This allows the function which includes the possibility of a callback to be a bit more general purpose. The call to the callback(), obviously, needs to be from within the callback of whatever asynchronous operation you are performing. In the example below, setTimeout is used as the asynchronous action.

var someString = "";
 
function do1() {
    doA(doB); //Call doA with doB as a callback.
}
 
function doA(callback) {
    setTimeout(function() {
        //setTimeout is an example of some asynchronous process that takes time
        //Change someString to a value which we "received" in this asynchronous call.
        someString = 'Timeout expired';
        //Do other processing that is normal for doA here.

        //Call the callback function, if one was passed to this function
        if (typeof callback === 'function') {
            callback();
        }
    }, 2000);
}
 
function doB() {
    //do something with someString;
    console.log(someString);
}

do1();

You can, of course, do this without using a global variable:

function do1() {
    doA(doB); //Call doA with doB as a callback.
}
 
function doA(callback) {
    setTimeout(function() {
        //setTimeout is an example of some asynchronous process that takes time
        //Simulate a result
        var result = 'Timeout expired'; 

        //Do other processing that is normal for doA here.

        //Call the callback function, if one was passed to this function
        if (typeof callback === 'function') {
            callback(result);
        }
    }, 2000);
}
 
function doB(result) {
    console.log(result);
}

do1();

Upvotes: 0

Bakyuns
Bakyuns

Reputation: 58

Usually, I have solved this problem like following code by callback parameter. However, I don't know this is correct answer. In my case, it's done well.

var someString = "";
function do1(){ 
    doA(doB);
}

function doA(callback){
    // some process that takes time and gets me a value
    someString = // the value I got in prior line
    callback();
}

function doB(){
    //do something with someString;
}

Upvotes: 1

Related Questions