我很难理解如何在以下代码块中使用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();
}
});
当您将函数作为参数传递时,它被称为回调函数,当您通过此回调函数返回值时,该值是传递函数的参数。
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);
这意味着,首先将动作分配给其他功能,而不要考虑这一点。满足条件时将执行操作。
我同意你的看法,代码片段中的代码非常不清楚。
你得到的答案很棒,但没有一个是指代码中实际使用的回调,我想特别提到。
首先,我将回答你的问题,然后我会详细说明它的复杂性。
事实上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如何处理回调?”或“我们的回调如何运作?”。
好问题!从中学到了很多东西!
我将尝试简化一个“具体”的例子(我希望)。
假设我有一个“计算”当天的功能,每当我需要当天时我会调用该功能(“不要打电话给我们,我们会打电话给你”或其他什么)。
var getCurrentDay = function (callback) {
var currDate = new Date();
callback(currDate, 'err');
});
};
getCurrentDay(function (returnDay) {
logger.info('Today is: ' + returnDay); });
回调函数是一个函数,它被传递给另一个函数(让我们将其他函数调用“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
回调是使用参数由另一个函数调用的任何函数
这里有一个查询假设考虑程序员通常如何写入文件:
- `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)
//执行继续流动 - 我们不等待文件打开
//一旦打开文件,我们就可以写信给它,但是在我们等待的时候我们可以做其他事情
不要过多考虑,请参阅以下示例。在下面的例子中,我只是从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允许函数作为参数。
因此,作为参数传递的任何函数都称为回调函数。我想现在回调对你来说是可以理解的。
回调函数意味着接一个调用:)
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