因此,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);
}
例如一个命名函数。但是,运行此程序时,我收到错误:
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)
有人可以告诉我为什么会发生这种情况吗? 我认为这等于内联编写吗?出于性能、模块化和可读性的原因,我想这样声明我的函数。
最佳答案
您遇到此错误是因为您传递了作为监听器返回的任何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);
}
}
关于node.js - 如何在 Nodejs 中使用监听器的回调函数而无需内联编写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42391006/