Existe-t-il une meilleure façon de faire appel au callback en javascript?

J'ai écrit un assistant de rappel, qui me permet de regrouper plusieurs rappels dans une seule variable de fonction:

function chainCallbacks() { var callbacks = arguments; return function () { for(var i = 0; i < callbacks.length; i++) { if(callbacks[i] != null) { callbacks[i].apply(null, arguments); } } }; } 

Cela fonctionne, mais je me demande s'il existe des bibliothèques javascript qui offrent les mêmes fonctionnalités? Ou même mieux, quelque chose qui simule le modèle "événement" de .NET?

 myEvent+=myCallback; 

J'ai modifié votre fonction chainCallbacks. Vous pouvez tester le code ci-dessous dans la console JS (j'utilise Chrome-works bien) et vérifiez le résultat.

 var result = 0; function a() { result += 5; console.log(result); _next(); } function b() { result += 10; console.log(result); _next(); } function c() { result += 20; console.log(result); _next(); } function chainCallbacks() { var _this = this; var _counter = 0; var _callbacks = arguments; var _next = function() { _counter++; if(_counter < _callbacks.length) { _callbacks[_counter].apply(_this); } }; _this._next = _next; return function() { if(_callbacks.length > 0) { _callbacks[0].apply(_this); } }; } var queue = chainCallbacks(a, b, c); queue(); 

L'idée est simple: vous appelez _next() chaque fois que votre fonction de rappel a fini d'être exécutée, et vous souhaitez passer à une autre. Vous pouvez donc appeler _next() par exemple après une certaine animation jQuery, et ainsi vous conserverez l'ordre des fonctions.

Si vous souhaitez remplacer un rappel par celui qui appelle l'original ainsi que d'autres, je voudrais simplement faire quelque chose comme ceci:

 Requirejs.config.callback = function(orig) { var fns = [orig, first, second, third]; return function() { fns.forEach(function(fn) { fn.apply(null, this); }, arguments); }; }(Requirejs.config.callback); 

Mais si vous faites cela souvent, je pense que votre solution sera aussi bonne que possible. Je ne vois pas besoin d'une bibliothèque.

 Requirejs.config.callback = chainCallbacks(Requirejs.config.callback, first, second, third) 

Une bibliothèque ne peut rien faire pour étendre la syntaxe de la langue en JavaScript. Il est limité à ce qui est disponible … aucune surcharge de l'opérateur ou quoi que ce soit.