2015-07-24 2 views
1

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

index.html:

socket.on('userCapture', data, function(callback){ 
    if(callback){ 
     //do stuff 
    } else { 
     alert('Username in use.'); 
    } 
}); 

index.js:

socket.on('userCapture', function(data, callback){ 
    username = data.username; 
    question = data.question; 
    socket.username = username; 
    socket.room = username; 

    function isInArray(arr,obj) { 
     return (arr.indexOf(obj) != -1); 
    } 
    if(isInArray(usernames, username)){ 
     callback(false); 
    } else { 
     callback(true); 
    } 
}); 

Идея заключается в том, что я проверяю массив usernames для переданного значения и передаю его клиенту, если он существует, или нет. Я не понимаю, почему это приводит к неопределенности, поскольку у меня есть тот же самый код в другом месте, и он работает.

С уважением

+0

, где находится 'index.js'? это серверная сторона? – Sosdoc

+0

Да, я использую nodejs с socket.io – Richard

+0

как вы отправляете 'обратный вызов'? Вы не можете отправлять функции через веб-узел. – Sosdoc

ответ

0

Вы указываете обратный вызов для socket.on(), вы не можете сделать это. Обратные вызовы возможны с emit() или send() согласно Socket.io docs, так как вы хотите в основном отправить сообщение, а затем получить результат без написания другого socket.on().

Изменить код, чтобы использовать emit()

Клиентский код

socket.emit('userCapture', data, function(response){ 
    if(response){ 
     //do stuff 
    } else { 
     alert('Username in use.'); 
    } 
}); 

Серверный код

socket.on('userCapture', function(data, callback){ 
    username = data.username; 
    question = data.question; 
    socket.username = username; 
    socket.room = username; 

    function isInArray(arr,obj) { 
     return (arr.indexOf(obj) != -1); 
    } 

    // you can just send the result back 
    callback(isInArray(usernames, username)); 
}); 
Смежные вопросы