回调函数示例

问题描述 投票:21回答:6

我很难理解如何在以下代码块中使用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();
    }
});
javascript jquery node.js callback socket.io
6个回答
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");
    }
});

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

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

document.body.addEventListener('click', myFunction);

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


4
投票

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

你得到的答案很棒,但没有一个是指代码中实际使用的回调,我想特别提到。

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

The answer

事实上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的特殊处理,它缺乏在前端找到回调的步骤。

Further Suggestion To make your code clearer

  • 将参数data的名称更改为nickname
  • 添加评论 - 为什么要在插座上放置nickname
  • 添加文档

使用jsdocs来解释回调正在做什么

/**

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

**/

然后是功能本身

/**
     @parameter {string} nickname 
     @parameter {NewUserCallback} callback
**/

The complexity

Usually, in nodejs, a callback expects the first argument to be an 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();
    }
});

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

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

我从来没有使用过socket.io,我无法找到一个文档来澄清这一点。所以我不得不下载他们的chat example并调试它==>所以我给出了答案,他们将函数从前端传递到后端。

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

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


1
投票

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

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

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




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

1
投票

回调函数是一个函数,它被传递给另一个函数(让我们将其他函数调用“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)

有关详细说明,请参阅此link


0
投票

回调是使用参数由另一个函数调用的任何函数

这里有一个查询假设考虑程序员通常如何写入文件:

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

//执行继续流动 - 我们不等待文件打开

//一旦打开文件,我们就可以写信给它,但是在我们等待的时候我们可以做其他事情


0
投票

不要过多考虑,请参阅以下示例。在下面的例子中,我只是从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允许函数作为参数。

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


0
投票

回调函数意味着接一个调用:)

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
© www.soinside.com 2019 - 2024. All rights reserved.