如何在Nodejs中为侦听器使用回调函数而不必编写内联?

时间:2017-02-22 12:06:35

标签: node.js performance listener

因此,Nodejs文档添加侦听器的方式是使用.on函数,例如

...
var somevar_i_need_to_use = 5;
request.on('close', function handle_close() {
    console.log("Connection closed" +somevar_i_need_to_use);
});
...

这样可以正常工作,例如我可以访问外部变量somevar_i_need_to_use。在不深入了解内部结构的情况下,我假设没有内联函数的等效方法是写:

...
var somevar_i_need_to_use = 5;
request.addListener('close', handle_close(a_somevar_i_need_to_use));
...

function handle_close(a_variable) {
    console.log("Connection closed" +a_variable);
}

e.g。命名函数。但是,运行它,我收到一个错误:

   throw new TypeError('listener must be a function');
   ^

TypeError: listener must be a function
    at IncomingMessage.addListener (events.js:197:11)
    at IncomingMessage.Readable.on (_stream_readable.js:680:33)
    at handle_get_request (/root/wshub/wsh.js:84:9)
    at Server.internal_request_handler (/root/wshub/wsh.js:59:9)
    at emitTwo (events.js:87:13)
    at Server.emit (events.js:172:7)
    at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:537:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:97:23)

有人能告诉我为什么会这样吗? 我认为这等于内联编写它?我想以性能,模块性和可读性为由宣布我的功能。

2 个答案:

答案 0 :(得分:2)

您遇到此错误,因为您传递的handle_close函数返回的结果为侦听器,在这种情况下是未定义的。要实现所需的行为,请尝试以下方法:

var somevar_i_need_to_use = 5;
request.addListener('close', create_close_handler(a_somevar_i_need_to_use));


function create_close_handler(a_variable) {
    return function named_handler(...listener_args) {
        console.log("Connection closed" +a_variable);
    }
}

答案 1 :(得分:1)

添加侦听器时,只需使用不带参数的函数名称:

request.addListener('close', handle_close);

var handler_variable = 0;
function handle_close(arg_variablle) {
  /* do something with arg_variable and handler_variable ... */
}

如果你像这样调用函数(使用handle_close(arguments)),它将不会将函数添加为侦听器,而是函数的返回值。这通常不是你想要的。