回调函数示例

Posted

技术标签:

【中文标题】回调函数示例【英文标题】:Callback function example 【发布时间】:2014-04-21 22:44:05 【问题描述】:

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

function callback()尚未定义时,我们如何在函数体中使用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();
    
);

【问题讨论】:

回调是 on() 函数的回调函数的参数,所以它是在你使用的任何软件中声明的,我猜是 socket.io,但我从未见过像socket.io这样的回调,你确定你使用的任何东西都有回调函数吗? 感谢您的回复。我正在使用 Node、JQuery、javascript,——是的,有一个回调函数。需要注意的是回调函数被传递到函数中,然后在函数中使用,这让我感到困惑:) 你只是在调用你在特定条件下传递的函数,这有什么好混淆的? 一切对我来说都有意义,除了 callback(true)callback(false) 行。我知道callback() 是由 JavaScript 定义的,函数是 JS 中的对象,因此它们可以作为参数传递给函数等。我不明白这种情况下的用法,这如何帮助解决手头的问题?我知道callback() 只是我正在调用的一个普通函数,但是 callback() 实际上是做什么的? callback() 实际上是做什么的?它做任何你想做的事,你定义它。例如,如果您将警报作为回调传递,它将警报真或假。 【参考方案1】:

这里有一个例子,回调函数的用法很容易理解。

一个登录函数,它与服务器异步执行用户登录。 由于异步调用,我们需要在服务器收到日期后获取登录结果。

    const axios = require('axios');

    function login(loginData,callbackSuccess,callBackFailure)  
      axios
      .post("/api/login",loginData)
      .then((response) => 
        callbackSuccess(response);
      )
      .catch((error) => 
        callBackFailure(error);
      );
    
    
    function callbackSuccess(data) 
      console.log("Login response :",data);
    
    
    function callBackFailure(error) 
      console.log("Login failed :",error);
    
    
    let userData = 
      username : "test",
      password : "abcd123"
    
    
    login(userData,callbackSuccess,callBackFailure);

【讨论】:

【参考方案2】:

函数内部的函数称为回调函数。或者让我说,存在于父函数内部的内部函数称为回调函数。

如果你想在 task1 之后完成 task2。然后您可以将 task2 作为回调,这将异步运行

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

不用想太多,看下面的例子。 在下面的示例中,我只是从add 函数中调用print 函数。

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

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

【讨论】:

但是不还是同步执行的吗?所以回调基本上是传递函数引用,它仍然是同步执行的。我说的对吗?【参考方案5】:

回调函数,是作为参数传递给另一个函数(我们称这个另一个函数“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

【讨论】:

【参考方案6】:

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

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

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

//执行继续进行——我们不等待文件被打开

//打开文件后,我们可以对其进行写入,但在等待的同时,我们可以做其他事情

【讨论】:

【参考方案7】:

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

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

意思是,先将动作分配给其他功能,不要考虑这个。条件满足时执行动作。

【讨论】:

我遇到的最好的例子(代码sn-p)!我很困惑,然后爬了很多文章,现在这个例子提供了清晰的解释。【参考方案8】:

我同意你的观点,sn-p 中的代码非常不清楚。

你得到的答案很好,但是没有一个是指代码中回调的实际使用,我想具体参考一下。

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

答案

原来 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 添加 cmets - 为什么将 nickname 放在套接字上? 添加文档

使用jsdocs解释回调在做什么

/**

     @callback NewUserCallback 
     @param boolean booleanParameter does something.. 

**/

然后是函数本身

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

复杂性

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 如何处理回调?”的标题下用大字体强调这一点。或“我们的回调是如何工作的?”。

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

【讨论】:

【参考方案9】:

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

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

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




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

【讨论】:

以上是关于回调函数示例的主要内容,如果未能解决你的问题,请参考以下文章

回调函数示例

有关函数指针和回调函数定义的示例

javascript 具有回调函数示例的异步函数+ return / Ajax调用

Node.js回调函数事件机制(EventEmitter类)全局对象

JQuery回调函数

回调函数执行过程分析