164 votes

Mieux comprendre les fonctions de rappel en JavaScript

Je comprends passer dans une fonction à une autre fonction comme un rappel et l'exécuter, mais je ne comprends pas la meilleure implémentation pour le faire. Je cherche un exemple très basique, comme ceci:

 var myCallBackExample = {
    myFirstFunction : function( param1, param2, callback ) {
    	// Do something with param1 and param2.
    	if ( arguments.length == 3 ) {
    		// Execute callback function.
    		// What is the "best" way to do this?
    	}
    },
    mySecondFunction : function() {
    	myFirstFunction( false, true, function() {
    		// When this anonymous function is called, execute it.
    	});
    }
};
 

Dans myFirstFunction, si je retourne un nouveau callback (), alors cela fonctionne et exécute la fonction anonyme, mais cela ne me semble pas être la bonne approche.

133voto

krosenvold Points 35979

Vous pouvez juste dire

 callback();
 

Alternativement, vous pouvez utiliser la méthode call si vous voulez ajuster la valeur de this dans le rappel.

 callback.call( newValueForThis);
 

À l'intérieur de la fonction this serait ce que newValueForThis est.

91voto

arunjitsingh Points 1315

Vous devriez vérifier si le rappel existe, et est une fonction exécutable:

 if (callback && typeof(callback) === "function") {
    // execute the callback, passing parameters as necessary
    callback();
}
 

Beaucoup de bibliothèques (jQuery, dojo, etc.) utilisent un modèle similaire pour leurs fonctions asynchrones, ainsi que node.js pour toutes les fonctions asynchrones (nodejs passe généralement error et data au rappel). Regarder dans leur code source aiderait!

34voto

Ionuț G. Stan Points 62482

Il y a 3 possibilités pour exécuter une fonction:

var callback = function(x, y) {
    // "this" may be different depending how you call the function
    alert(this);
};
  1. rappel(argument_1, argument_2);
  2. de rappel.appel(some_object, argument_1, argument_2);
  3. de rappel.appliquer(some_object, [argument_1, argument_2]);

La méthode que vous choisissez dépend si:

  1. Vous avez les arguments stockées dans un Tableau ou comme des variables distinctes.
  2. Vous voulez appeler cette fonction dans le contexte de certains objets. Dans ce cas, en utilisant le mot clé "this" dans ce rappel serait référence à l'objet passé en argument dans l'appel (), ou(). Si vous ne voulez pas passer le contexte de l'objet, utilisez la valeur null ou undefined. Dans ce dernier cas, l'objet global serait utilisé pour "ce".

Les Docs pour la Fonction.d'appel, Fonction.appliquer

6voto

annakata Points 42676

Les rappels concernent les signaux et "nouveau" concerne la création d'instances d'objets.

Dans ce cas, il serait encore plus approprié d'exécuter simplement "callback ()". que "return new callback ()" car vous ne faites rien avec une valeur de retour.

(Et le test arguments.length == 3 est vraiment maladroit, fwiw, mieux vaut vérifier que le paramètre callback existe et qu'il s'agit d'une fonction.)

6voto

faeb187 Points 61

la bonne mise en œuvre serait:

 if( callback ) callback();
 

Cela rend le paramètre de rappel facultatif.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X