Yogesh kumar
Yogesh kumar

Reputation: 15

passing function to a class in nodejs

I have a function that I need to pass to a class I have defined in nodeJs. The use case scenario is I want to give the implementer of the class the control of what to do with the data received from createCall function. I don't mind if the method becomes a member function of the class. Any help would be appreciated.

 //Function to pass. Defined by the person using the class in their project.
var someFunction = function(data){
    console.log(data)
}

//And I have a class i.e. the library.
class A {
    constructor(user, handler) {
       this.user = user;
       this.notificationHandler = handler;  
    }
     createCall(){
        var result = new Promise (function(resolve,reject) {
              resolve(callApi());
        });
        //doesn't work. Keeps saying notificationHandler is not a function
        result.then(function(resp) {
                this.notificationHandler(resp); 
        }) ;

        //I want to pass this resp back to the function I had passed in the 
       // constructor. 
        //How do I achieve this.
     }
     callApi(){ ...somecode...  }
}

// The user creates an object of the class like this
var obj = new A("[email protected]", someFunction);
obj.createCall(); // This call should execute the logic inside someFunction after the resp is received.

Upvotes: 0

Views: 1622

Answers (1)

Crogo
Crogo

Reputation: 493

Arrow functions (if your Node version supports them) are convenient here:

 class A {

   constructor(user, handler) {
     this.user = user;
     this.notificationHandler = handler;
   }

   createCall() {

     var result = new Promise(resolve => {
       // we're fine here, `this` is the current A instance
       resolve(this.callApi());
     });

     result.then(resp => {
       this.notificationHandler(resp);
     });

   }

   callApi() {
     // Some code here...
   }

 }

Inside arrow functions, this refers to the context that defined such functions, in our case the current instance of A. The old school way (ECMA 5) would be:

 createCall() {

   // save current instance in a variable for further use
   // inside callback functions
   var self = this;

   var result = new Promise(function(resolve) {
     // here `this` is completely irrelevant;
     // we need to use `self`
     resolve(self.callApi());
   });

   result.then(function(resp) {
     self.notificationHandler(resp);
   });

 }

Check here for details: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_separate_this

Upvotes: 1

Related Questions