回调函数示例

Anc*_*end 22 javascript jquery callback node.js socket.io

我很难理解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();
    }
});
Run Code Online (Sandbox Code Playgroud)

Sum*_*ati 27

当您将函数作为参数传递时,它被称为回调函数,当您通过此回调函数返回值时,该值是传递函数的参数.

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");
    }
});
Run Code Online (Sandbox Code Playgroud)

基本上,callbacks()用于异步概念.它是在特定事件上调用的.

myFunction也是回调函数.例如,它发生在单击事件上.

document.body.addEventListener('click', myFunction);
Run Code Online (Sandbox Code Playgroud)

这意味着,首先将动作分配给其他功能,而不要考虑这一点.满足条件时将执行操作.

  • 我遇到的最好的例子(代码片段)!我很困惑,然后刮了很多文章,现在这个例子提供了清晰的解释。 (2认同)

guy*_*abi 5

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

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

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

答案

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

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

寻找看起来像这样的代码

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

我假设在您的情况下,真/假值意味着如果添加了新用户(真)或不添加(假),则返回到前端。

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

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

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

  • 将参数名称更改data为nickname
  • 添加评论 - 你为什么要放在nickname套接字上?
  • 添加文档

使用 jsdocs 解释回调在做什么

/**

     @callback NewUserCallback 
     @param {boolean} booleanParameter does something.. 

**/
Run Code Online (Sandbox Code Playgroud)

然后在函数本身

/**
     @parameter {string} nickname 
     @parameter {NewUserCallback} callback
**/
Run Code Online (Sandbox Code Playgroud)

复杂性

通常,在 nodejs 中,回调期望第一个参数为 error,因此阅读您的代码,它说

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();
    }
});
Run Code Online (Sandbox Code Playgroud)

不是你期望的模式,是吗?我想这就是你问这个问题的原因。

问题仍然是 socket.io 的回调意味着什么,对吗?也许他们的回调不希望错误作为第一个参数。

我从未使用过 socket.io,我也找不到文档来澄清这一点。所以我不得不下载他们的聊天示例并调试它 ==> 所以我给出的答案是,他们正在将函数从前端传递到后端。

Socket.io 绝对应该在他们的文档中以大字体强调这一点,标题为“socket.io 如何处理回调?” 或“我们的回调如何工作?”。

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