98 votes

Style JavaScript pour les callbacks optionnels

J'ai quelques fonctions qui, de temps en temps (pas toujours), vont recevoir un callback et l'exécuter. Est-ce que vérifier si la callback est définie/fonction est un bon style ou y a-t-il un meilleur moyen ?

Exemple :

function save (callback){
   .....do stuff......
   if(typeof callback !== 'undefined'){
     callback();
   };
};

0 votes

Dans les navigateurs modernes, vous pouvez simplement utiliser typeof callback !== undefined donc laissez de côté le '

1 votes

Et si vous appelez simplement save() ? Cela ne va-t-il pas donner une erreur ou un avertissement de linting parce qu'un argument est manquant ? Ou bien c'est parfaitement correct et le callback est simplement undefined ?

146voto

Raynos Points 82706

Je préfère personnellement

typeof callback === 'function' && callback();

Le site typeof est cependant douteuse et ne doit être utilisée que pour les cas suivants "undefined" et "function"

Les problèmes liés à la typeof !== undefined est que l'utilisateur peut passer une valeur qui est définie et pas une fonction

4 votes

typeof n'est pas douteux. C'est parfois vague, mais je ne dirais pas que c'est douteux. Je suis d'accord, cependant, pour dire que si vous appelez le callback en tant que fonction, il est préférable de vérifier qu'il s'agit bien d'une fonction et non, vous savez, d'un numéro :-)

1 votes

@T.J.Crowder dodgy n'est peut-être pas le bon mot, il est bien défini mais inutile à cause de la boxe et du retour. "object" 95% du temps.

2 votes

typeof ne provoque pas de boxe. typeof "foo" es "string" pas "object" . C'est en fait le seul moyen de savoir si l'on a affaire à une primitive de type chaîne de caractères ou à une String objet. (Vous pensez peut-être à Object.prototype.toString qui est très pratique mais provoque la boxe).

54voto

Pablo Fernandez Points 32003

Vous pouvez aussi le faire :

var noop = function(){}; // do nothing.

function save (callback){
   callback = callback || noop;
   .....do stuff......
};

C'est particulièrement utile si vous utilisez la fonction callback à quelques endroits.

De plus, si vous utilisez jQuery vous avez déjà une fonction de ce type, elle s'appelle $.noop

4 votes

À mon avis, c'est la solution la plus élégante.

2 votes

Approuvé. Cela rend également les tests plus faciles, car il n'y a pas de condition if.

0 votes

C'est plus élégant que la suggestion la plus votée, à mon avis.

43voto

ninja123 Points 149

Faites simplement

if (callback) callback();

Je préfère appeler le callback s'il est fourni, quel que soit son type. Ne la laissez pas échouer silencieusement, afin que l'implémenteur sache qu'il a passé un argument incorrect et puisse le corriger.

1voto

zVictor Points 1501

Il est facile de le faire avec ArgueJS :

function save (){
  arguments = __({callback: [Function]})
.....do stuff......
  if(arguments.callback){
    callback();
  };
};

1voto

Mrchief Points 25418

Si le critère d'exécution de la fonction de rappel est de savoir si elle est définie ou non, alors tout va bien. Aussi, je suggère de vérifier si c'est vraiment une fonction en plus.

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