Пример функции обратного вызова
Мне трудно понять, как функция callback()
используется в следующем блоке кода. Как мы используем callback()
как функцию, в теле функции, когда function callback{}
не определена? Каковы рецензии на передачу true/false в качестве параметров в функцию обратного вызова ниже?
Я ценю любые разъяснения, спасибо заранее!
socket.on('new user', function(data, callback){
if (nicknames.indexOf(data) != -1){
callback(false);
}else{
callback(true);
socket.nickname = data;
nicknames.push(socket.nickname);
updateUserList();
}
});
Ответы
Ответ 1
Когда вы передаете функцию в качестве аргумента, она называется функцией обратного вызова, и когда вы возвращаете значение через эту функцию обратного вызова, значение является параметром переданной функции.
function myFunction(val, callback){
if(val == 1){
callback(true);
}else{
callback(false);
}
}
myFunction(0,
//the true or false are passed from callback()
//is getting here as bool
// the anonymous function below defines the functionality of the callback
function (bool){
if(bool){
alert("do stuff for when value is true");
}else {
//this condition is satisfied as 0 passed
alert("do stuff for when value is false");
}
});
В принципе, callbacks() используются для асинхронных концепций. Он вызывается на конкретном событии.
myFunction
также является функцией обратного вызова. Например, это происходит при событии клика.
document.body.addEventListener('click', myFunction);
Это означает, что сначала назначьте действие другой функции и не думайте об этом. Действие будет выполняться при выполнении условия.
Ответ 2
Я согласен с вами, код в фрагменте очень неясен.
Ответы, которые вы получили, замечательны, однако ни один из них не ссылается на фактическое использование обратного вызова в вашем коде, и я хотел бы упомянуть об этом конкретно.
Во-первых, я отвечу на ваш вопрос, а затем подробно расскажу о его сложности.
Ответ
получается socket.io делают что-то очень классное, что не является стандартом, который я знаю. socket.io передают обратный вызов с внешнего интерфейса на бэкэнд!
Поэтому, чтобы ответить на ваш вопрос, what is this callback function
вы должны посмотреть на свой внешний код.
Найдите код, который выглядит так:
socket.emit('new user', data, function( booleanParameter ){
// what are you doing with booleanParameter here?
});
Я предполагаю, что в вашем случае true/false значения предназначены для возврата к интерфейсу, если новый пользователь был добавлен (true) или нет (false).
Или, возможно, если псевдоним уже используется или нет, чтобы интерфейс мог отображать строку ошибки, если она есть.
В принципе, @SumanBogati был прав в своем ответе, но я чувствовал, что ему не хватает шага поиска обратного вызова в интерфейсе из-за специальной обработки socket.io.
Дальнейшее предложение Чтобы сделать код более четким
- Изменить имя параметра
data
для nickname
- Добавить комментарии - почему вы размещаете
nickname
в сокете? - добавить документацию
Используйте jsdocs, чтобы объяснить, что делает обратный вызов.
/**
@callback NewUserCallback
@param {boolean} booleanParameter does something..
**/
а затем по самой функции
/**
@parameter {string} nickname
@parameter {NewUserCallback} callback
**/
Сложность
Обычно в nodejs обратный вызов ожидает, что первым аргументом будет ошибка, поэтому, читая ваш код, он говорит
socket.on('new user', function(data, callback){
if (nicknames.indexOf(data) != -1){
///// THERE IS NO ERROR
callback(false);
}else{
///// THERE IS AN ERROR
callback(true);
/// do more stuff after the error
socket.nickname = data;
nicknames.push(socket.nickname);
updateUserList();
}
});
Не шаблон, который вы ожидаете, не так ли? Наверное, поэтому вы задали вопрос.
Тем не менее остается вопрос, что означает обратный вызов socket.io, верно? Возможно, их обратный вызов не ожидает ошибки в качестве первого аргумента.
Я никогда не использовал socket.io, и я не смог найти документацию, чтобы прояснить это. Поэтому мне пришлось загрузить свой пример чата и отладить его ==>, и поэтому ответ, который я дал, они передают функцию из интерфейса на бэкэнд.
Socket.io должен определенно подчеркнуть этот момент большим шрифтом в своей документации под заголовком "Как выполняет обратный вызов socket.io?" или "Как работают наши обратные вызовы?".
Отличный вопрос! Многому научился!
Ответ 3
Я попытаюсь упростить "конкретный" пример (надеюсь).
Скажем, у меня есть функция, которая "вычисляет" текущий день, и я буду называть эту функцию каждый раз, когда мне понадобится текущий день ("Не позвоните нам, мы вам позвоним" или что-то еще).
var getCurrentDay = function (callback) {
var currDate = new Date();
callback(currDate, 'err');
});
};
getCurrentDay(function (returnDay) {
logger.info('Today is: ' + returnDay); });
Ответ 4
Функция обратного вызова - это функция, которая передается другой функции (позволяет вызывать эту другую функцию "otherFunction") в качестве параметра, и функция обратного вызова вызывается (или выполняется) внутри другой функции.
Вот мой простой пример для функции обратного вызова
// callback add
function add(a, b){
console.log(a+b);
}
// Main function
function getInput(cb) {
c = 5+5;
d = 6+6;
if (typeof cb === 'function') {
cb(c, d);
}
}
getInput(add)
Для подробного объяснения обратитесь по этой ссылке
Ответ 5
Обратный вызов - это любая функция, которая вызывается другой функцией с использованием параметра.
Вот запрос для вас Предположим, что рассмотрим, как программисты обычно пишут в файл:
- 'fileObject = open(file)' //now that we have to wait for the file to open, after that we can write to this file*
- fileObject.write("We are writing to the file.") // but i want to write , not wait
Этот случай - когда обратные вызовы полезны:
//we can pass **writeToFile()** (a callback function) to the open file function
- fileObject = open(file, writeToFile)
//выполнение продолжается - мы не ждем открытия файла
//как только файл открыт, мы можем писать в него, но пока мы ждем, мы можем делать другие вещи
Ответ 6
Не задумываясь, посмотрите на следующий пример.
В следующем примере я просто вызываю функцию print
из функции add
.
function print( ans ){
console.log(ans) ; // 7
}
function add(a, b){
print(a+b) ;
}
add(2,5);
Что если я использую функцию print
в качестве параметра? Не используя функцию print
из глобальной области видимости, я просто передаю функцию print
в качестве аргумента.
function print( ans ){
console.log(ans) ; // 7
}
function add(a, b, callback){ // here callback = print
callback(a+b) ;
}
add(2,5,print); // print function as a parameter
Как правило, JavaScript допускает функцию в качестве параметра.
Поэтому любая функция, переданная в качестве аргумента, называется функцией обратного вызова.
Я думаю, что теперь обратный вызов вам понятен.
Ответ 7
Функция обратного вызова означает вызов за другим :)
doHomeWork('math',alertMsg);
Над строкой сказано 1. позвоните doHomeWork
, а затем позвоните 2. alertMsg
, вот оно. :)
function doHomeWork(subject,callback){
console.info("study: "+subject);
callback();
}
alertMsg = function(){
console.info("alert");
}
doHomeWork('math',alertMsg);
Вывод:
study: math
alert