我很难理解在以下代码块中如何使用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();
}
});
答案 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);