2017-02-22 32 views
0

Итак, способ Nodejs документы добавления слушателей с помощью .on функции, такие какКак использовать функции обратного вызова для слушателей в Nodejs без необходимости писать inline?

... 
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) 

Может кто-нибудь сказать мне, почему это происходит? Я бы предположил, что это равнозначно написанию встроенного? Я хочу объявить свои функции как это для производительности, модульности и удобства чтения.

+0

Вы звоните 'handle_close', а затем передавая ее результат (' undefined') в 'addListener', не передавая саму функцию. –

ответ

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)), как вы делаете, это не добавит функцию в качестве слушателя, но возвращаемое значение функции. Это чаще всего не то, что вы хотите.

+0

О, это верно, используя 'handle_close (args)' im * calling * функцию, которая неверна. Благодаря! – enrm

+0

Как я могу использовать этот «дизайн», чтобы передать количество переменных в слушателя? как метод 'handle_close' знает, какие параметры нужно принимать? – enrm

+0

@enrm Переменные, объявленные вне функции (например, в глобальной области), доступны изнутри функции и могут «просто использоваться». Метод 'handle_close' задается параметром, когда он вызывается' request'; какие параметры он получает, чаще всего документируется в документации к функции (в данном случае 'request.addListener'). – Frxstrem

2

Эта ошибка возникает из-за того, что вы передаете результат любой функции handle_close как listener, которая в этом случае не определена. Для достижения желаемого поведения, попробовать что-то вроде этого:

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); 
    } 
} 
+0

Это фактически учитывает любые переменные, которые могут быть объявлены во внешней области, которые мне могут понадобиться использовать. Это то, что мне нужно, потому что внешняя область имеет несколько переменных, которые мне нужны. Спасибо! – enrm