J'ai de la difficulté à comprendre comment la fonction callback()
est utilisée dans le bloc de code suivant. Comment utilisons-nous callback()
en tant que fonction, dans le corps de la fonction, lorsque function callback{}
n'a pas été défini? Quelles sont les conséquences du passage vrai/faux en tant que paramètres dans la fonction de rappel ci-dessous?
J'apprécie toute clarification, merci d'avance!
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();
}
});
Lorsque vous transmettez une fonction en tant qu'argument, elle est appelée fonction de rappel et lorsque vous renvoyez une valeur via cette fonction de rappel, la valeur est un paramètre de la fonction transmise.
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");
}
});
Fondamentalement, les callbacks () sont utilisés pour les concepts asynchrones. Il est invoqué pour un événement particulier.
myFunction
est également une fonction de rappel. Par exemple, cela se produit lors d'un événement click.
document.body.addEventListener('click', myFunction);
Cela signifie, commencez par assigner l'action à une autre fonction, et n'y pensez pas. L'action sera effectuée lorsque la condition est remplie.
Je suis d'accord avec vous, le code dans l'extrait n'est pas très clair.
Les réponses que vous avez obtenues sont excellentes, mais aucune ne fait référence à l'utilisation réelle du rappel dans votre code, et je voudrais le mentionner spécifiquement.
Tout d'abord, je vais répondre à votre question, puis je développerai sa complexité.
tourne socket.io fait quelque chose de très cool qui n'est pas la norme que je connais .. socket.io passe le callback du front-end au backend!
Donc, pour répondre à votre question what is this callback function
- vous devez regarder votre code frontal.
Recherchez le code qui ressemble à ceci
socket.emit('new user', data, function( booleanParameter ){
// what are you doing with booleanParameter here?
});
Je suppose que dans votre cas, les valeurs true/false sont censées être renvoyées à l'interface si un nouvel utilisateur a été ajouté (true) ou non (false).
Ou peut-être que le pseudonyme est déjà utilisé ou non, de sorte que le client puisse afficher une chaîne d'erreur s'il est ..
Fondamentalement, @SumanBogati avait raison dans sa réponse, mais j’ai estimé qu’il manquait l’étape consistant à trouver le rappel dans le système frontal en raison du traitement spécial de socket.io.
data
par nickname
nickname
sur le socket?Utilisez jsdocs pour expliquer ce que fait le rappel
/**
@callback NewUserCallback
@param {boolean} booleanParameter does something..
**/
puis sur la fonction elle-même
/**
@parameter {string} nickname
@parameter {NewUserCallback} callback
**/
D'habitude, dans nodejs, un rappel s'attend à ce que le premier argument soit une erreur , donc, en lisant votre code, il est écrit
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();
}
});
Pas le modèle que vous attendez, n'est-ce pas? Je suppose que c'est pourquoi vous avez posé la question.
Reste la question de savoir ce que signifie le rappel de socket.io, n'est-ce pas? Peut-être que leur rappel ne s'attend pas à une erreur comme premier argument.
Je n'ai jamais utilisé socket.io et je n'ai pas trouvé de documentation pour clarifier cela. Je devais donc télécharger leur exemple chat et le déboguer ==> et la réponse que j’ai donnée est qu’ils passent la fonction de l’interface au backend.
Socket.io devrait absolument insister sur ce point en gros caractères dans sa documentation sous le titre "Comment socket.io gère-t-il les rappels?" ou "Comment fonctionnent nos rappels?".
Bonne question! J'ai beaucoup appris de ça!
Je vais essayer de simplifier avec un exemple "concret" (j'espère).
Disons que j'ai une fonction qui "calcule" le jour actuel et que j'appellerai cette fonction chaque fois que j'aurais besoin du jour actuel ("Ne nous appelle pas, nous t'appellerons" ou peu importe).
var getCurrentDay = function (callback) {
var currDate = new Date();
callback(currDate, 'err');
});
};
getCurrentDay(function (returnDay) {
logger.info('Today is: ' + returnDay); });
Une fonction de rappel est une fonction qui est passée à une autre fonction (appelons cette autre fonction "otherFunction") en tant que paramètre, et la fonction de rappel est appelée (ou exécutée) à l'intérieur de l'autre function.
Voici mon exemple simple pour la fonction de rappel
// 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)
Pour une explication détaillée, reportez-vous au link
Sans trop réfléchir, voir l'exemple suivant . Dans l'exemple suivant, j'appelle simplement la fonction print
à partir de la fonction add
.
function print( ans ){
console.log(ans) ; // 7
}
function add(a, b){
print(a+b) ;
}
add(2,5);
Que se passe-t-il si j'utilise la fonction print
en tant que paramètre? Sans utiliser la fonction print
de la portée globale, je passe simplement la fonction print
en argument.
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
Généralement, JavaScript permet de fonctionner en tant que paramètre.
Ainsi, toute fonction passée en tant qu'argument s'appelle une fonction de rappel ..__Je pense que le rappel est compréhensible pour vous.
Un rappel est une fonction appelée par une autre fonction à l'aide du paramètre
Voici une requête pour vous Supposons que Considérons comment les programmeurs écrivent normalement dans un fichier:
- `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
Ce cas - où les rappels sont utiles:
//we can pass **writeToFile()** (a callback function) to the open file function
- fileObject = open(file, writeToFile)
// l'exécution continue - nous n'attendons pas que le fichier soit ouvert
// une fois le fichier ouvert, nous pouvons y écrire, mais en attendant, nous pouvons faire autre chose