2011-10-10 3 views
1

Я пытаюсь понять код от socket.io/examples/chat/app.js. Я не могу объяснить, что fn() Вызывает среднее значение в строках 71 и 73. Я предполагаю, что это функция обратного вызова, но где его определение? Это короткий вызов другой функции из app.js? ...
Это вызов функции прототипа объекта сокета?Значение fn() в файле примера socket.io chat

Фрагмент (строки 69-78):

[...] 
    socket.on('nickname', function (nick, fn) { 
     if (nicknames[nick]) { 
      fn(true); 
     } else { 
      fn(false); 
      nicknames[nick] = socket.nickname = nick; 
      socket.broadcast.emit('announcement', nick + ' connected'); 
      io.sockets.emit('nicknames', nicknames); 
     } 
    }); 
[...] 

ответ

2

fn передается в качестве аргумента функции обратного вызова, прямо здесь:

socket.on('nickname', function (nick, fn) { 
             ^^ 

Поскольку функции JavaScript являются объектами, они могут храниться в переменных - и передаются в качестве аргументов в другие функции.

использования функции обратного вызова в данном конкретном случае duscussed в разделе «Получение подтверждения» из документации Socket.io - назвав его с некоторыми данными посылает сообщение клиенту в ответ на это сообщение.

+0

Да, я заметил это, но как узнать, что такое фактическое тело этой функции (я имею в виду fn)? Клиент отправляет сообщение «ник». После этой функции (nick, fn) вызывается назад. Но, опять же, какая функция передается как fn? ... – gvlax

+0

Ok @ Сидничный, я думаю, что понял. Фактически, это объясняется в ** Отправка и получение данных (подтверждения). ** раздел по [link] (http://socket.io/#how-to-use) – gvlax

+0

@gvlak: определена функция обратного вызова [здесь] (https://github.com/LearnBoost/socket.io/blob/0339e745fd75857b844f46368cc6d85aef295146/lib/namespace.js#L269), в namespace.js. – s4y

0

п является ссылкой на другую функцию, которая вызывается изнутри на событие псевдонима.

+0

Да, но моя проблема в том, что, например, fn (true) или fn (false) делает ... – gvlax

+0

Спасибо, Джейсон. По моему мнению, 'fn (true | false)' в моем случае соответствует 'fn ('woot');' в примере на странице [socket.io # how-to-use] (http: // socket .io/# how-to-use) – gvlax

0

В javascript функции рассматриваются как объекты, поэтому они могут передаваться в качестве аргумента в функции обратного вызова.

Смежные вопросы