回调函数示例
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调用