回调函数示例

时间:2014-03-16 20:11:24

标签: javascript jquery node.js callback 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();
    }
});

9 个答案:

答案 0 :(得分:24)

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

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

这意味着,首先将动作分配给其他功能,并且不要考虑这个。当条件满足时,将执行该操作。

答案 1 :(得分:4)

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

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

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

答案

结果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
**/

复杂性

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如何处理回调?”或“我们的回调如何运作?”。

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

答案 2 :(得分:1)

我会尝试使用"具体的"例子(我希望)。

我们说我有一个"计算"当天我每次需要当天都会调用该功能("不要打电话给我们,我们会打电话给你"或其他什么)。

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




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

答案 3 :(得分: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

答案 4 :(得分: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)

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

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

答案 5 :(得分: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允许将函数用作参数。

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

答案 6 :(得分: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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

这是一个易于理解回调函数用法的示例。

  • 一种登录功能,用于异步执行与服务器的用户登录。
  • 由于异步调用,一旦从服务器接收到日期,我们就需要获取登录结果。

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