Пример функции обратного вызова

Мне трудно понять, как функция 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