2015-08-16 1 views
2

J'ai un code qui émet et gère les événements dans le même fichier .js. Les événements d'émission peuvent être de type "bonjour", "monde", "utilisateur", etc. à titre d'exemple. Toutes les fonctions du gestionnaire d'événements (.on) ont une approche similaire pour gérer les événements à l'intérieur des fonctions de base des erreurs et des rappels (exactement la même chose). Y a-t-il une suggestion pour refactoriser et améliorer le code redondant.Efficacité du code dans Node.js pour plusieurs écouteurs d'événements

localEvents.on("hello", function(request , reply){ 
    console.log("inside event for hello"); 
    hello.intialize() { 
     // handle initialise error and callback // 
    }; 
}); 

localEvents.on("world", function(request , reply){ 
    console.log("inside event for world"); 
    world.initialise() { 
     // handle initialise error and callback // 
    }; 
}); 

localEvents.on("user", function(request , reply){ 
    console.log("inside event for user"); 
    user.initialise() { 
     // handle initialise error and callback // 
    }; 
}); 

localEvents.emit(task, request, reply); 
+0

Pouvez-vous me dire ce que sont "request" et "reply" dans les paramètres de la fonction? – Kushal

+0

demande et réponse sont des objets serveur hapi, comme req et rep en express. – user3601166

Répondre

2

Vous pouvez créer une fonction d'aide, comme:

function addHandler(evName, obj) { 
    localEvents.on(evName, function(request, reply) { 
    console.log("inside event for %s", evName); 
    obj.initialise(function(err) { 
     // handle initialise error and callback 
    }); 
    }); 
} 

Ensuite, il suffit l'appeler comme:

addHandler('hello', hello); 
addHandler('world', world); 
addHandler('user', user); 

Ou si vous voulez vraiment réduire encore la répétition dans la arguments que vous pourriez créer un assistant comme:

function addHandler(evName) { 
    var obj = eval(evName); 
    localEvents.on(evName, function(request, reply) { 
    console.log("inside event for %s", evName); 
    obj.initialise(function(err) { 
     // handle initialise error and callback 
    }); 
    }); 
} 

vous permettant de puis simplement faire:

addHandler('hello'); 
addHandler('world'); 
addHandler('user'); 
+0

Comment allons-nous émettre l'événement 'localEvents.emit (tâche, requête, réponse);' dans l'approche ci-dessus? – user3601166

+0

Que voulez-vous dire * comment *? Vous le faites juste ... – mscdex

+0

@ user3601166 - le '.emit()' est exactement le même que c'était avant. votre variable 'localEvents' est inchangée donc vous avez donc' localEvents.emit (...) 'comme vous le faisiez auparavant. – jfriend00

1

Une façon simple de le faire - De cette façon, sera plus souple à tout changement que vous pourriez avoir besoin de faire dans les événements de rappel fonctions

var eventsList = { 
    "hello": function(request, reply) { 
     console.log("inside event for hello"); 
     hello.initialise() { 
      // handle initialise error and callback // 
     }; 
    }, 
    "world": function(request, reply) { 
     console.log("inside event for world"); 
     world.initialise() { 
      // handle initialise error and callback // 
     }; 
    }, 
    "user": function(request, reply) { 
     console.log("inside event for user"); 
     user.initialise() { 
      // handle initialise error and callback // 
     }; 
    } 
} 

function generateEvents(events){ 
    for(var e in events){ 
     localEvents.on(e, events.e) 
    } 
} 

generateEvents(eventsList) 
+0

Comment allons-nous émettre des événements ici? – user3601166

+1

Bien que ce soit une manière différente d'organiser le code, cela n'élimine pas vraiment beaucoup du code copié/dupliqué, donc je ne suis pas sûr de savoir comment cela augmente vraiment l'efficacité du code que le OP demandait. – jfriend00

+0

L'événement émet toujours la même chose que vous l'avez fait – Kushal