web-dev-qa-db-fra.com

Exemple de fonction de rappel

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();
    }
});
18
AnchovyLegend

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.

22
Suman Bogati

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é. 

La réponse

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. 

Suggestion supplémentaire Pour rendre votre code plus clair

  • Remplacez le nom du paramètre data par nickname
  • Ajouter des commentaires - pourquoi placez-vous nickname sur le socket?
  • ajouter de la documentation

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

La complexité

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!

4
guy mograbi

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); });
1
lironn

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

1
RAJA

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.

0
Mahmudul Hasan

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

0
Avinash Maurya