回调函数示例

IT技术 javascript jquery node.js callback socket.io
2021-02-03 19:45:32

我很难理解如何callback()在以下代码块中使用函数。

我们如何使用callback()作为函数,在函数体中,何时function callback()还没有被定义?

将真/假作为参数传递给下面的回调函数有什么影响?

我感谢任何澄清,提前致谢!

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();
    }
});
6个回答

当你将一个函数作为参数传递时,它被称为回调函数,当你通过这个回调函数返回一个值时,该值是传递函数的参数。

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

意思是,先把动作分配给其他函数,不要考虑这个。满足条件时将执行该操作。

我遇到的最好的例子(代码片段)!我很困惑,然后抓取了很多文章,现在这个例子提供了清晰的解释。
2021-04-09 19:45:32

我同意你的看法,代码片段中的代码很不清楚。

你得到的答案很好,但是没有一个涉及你的代码中回调的实际使用,我想特别引用它。

我先回答你的问题,然后再详细说明它的复杂性。

答案

事实证明,socket.io 正在做一些非常酷的事情,这不是我所知道的标准...... socket.io 正在将回调从前端传递到后端!

所以要回答你的问题what is this callback function- 你必须看看你的前端代码。

寻找看起来像这样的代码

  socket.emit('new user', data, function( booleanParameter ){
        // what are you doing with booleanParameter here?
  });

我假设在您的情况下,如果添加了新用户(真)或不添加(假),则真/假值将传递回前端。

或者,如果昵称已经被使用,那么前端可以显示一个错误字符串,如果它是..

基本上,@SumanBogati 的回答是正确的,但由于 socket.io 的特殊处理,我觉得它缺少在前端找到回调的步骤。

进一步的建议让你的代码更清晰

  • 将参数名称更改datanickname
  • 添加评论 - 你为什么要放在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 如何处理回调?” 或“我们的回调如何工作?”。

好问题!从中学到了很多!

我会尝试用一个“具体”的例子来简化(我希望)。

假设我有一个“计算”当天的函数,每次我需要当天时我都会调用该函数(“不要给我们打电话,我们会打电话给你”或其他什么)。

var getCurrentDay = function (callback) {
    var currDate = new Date();        
    callback(currDate, 'err');
   });
};




getCurrentDay(function (returnDay) {         
    logger.info('Today is: ' + returnDay); });

回调函数,是作为参数传递给另一个函数(让我们称这个另一个函数为“otherFunction”)的函数,并且回调函数在 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)

有关详细说明,请参阅此链接

不用多想,看下面的例子。在下面的例子中,我只是printadd函数中调用函数。

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 允许将函数作为参数。

所以任何作为参数传递的函数都称为回调函数。我认为现在回调对你来说是可以理解的。

但是不是还是同步执行的吗?所以回调基本上是传递函数引用,它仍然是同步执行的。我对吗?
2021-03-17 19:45:32