因此,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)
有人能告诉我为什么会这样吗? 我认为这等于内联编写它?我想以性能,模块性和可读性为由宣布我的功能。
答案 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)
),它将不会将函数添加为侦听器,而是函数的返回值。这通常不是你想要的。