web-dev-qa-db-fra.com

Comment écrire une fonction jquery qui accepte un rappel comme paramètre

J'ai la fonction suivante.

function ChangeDasPanel(controllerPath, postParams) {

    $.post(controllerPath, postParams, function(returnValue) {

        $('#DasSpace').hide("slide", { direction: "right" }, 1000, function() {

            $('#DasSpace').contents().remove();

            $('#DasSpace').append(returnValue).css("display", "block");

            $('#DasSpace').show("slide", { direction: "right" }, 1000);

        });

    });

};

Mais je veux pouvoir l'appeler comme ça

ChangeDasPanel("../Home/Test", {} ,function (){
  //do some stuff on callback
}

Comment puis-je implémenter la prise en charge des rappels dans ma fonction?

48
sjors miltenburg
function ChangeDasPanel(controllerPath, postParams, f) {
  $.get(
    controllerPath, 
    postParams, 
    function(returnValue) {
      var $DasSpace = $('#DasSpace');
      $DasSpace.hide(
        "slide", { direction: "right" }, 1000, 
        function() {
          $DasSpace.contents().remove();
          $DasSpace.append(returnValue).css("display", "block");
          $DasSpace.show("slide", { direction: "right" }, 1000);
        }
      );
      if (typeof f == "function") f(); else alert('meh');
    }
  );
};

Vous pouvez transmettre des fonctions comme tout autre objet en JavaScript. Passer une fonction de rappel est simple, vous le faites même vous-même dans l'appel $.post().

Vous pouvez décider si vous souhaitez que votre rappel soit appelé dans le cadre du rappel $.post() ou séparément.

75
Tomalak

Vous savez que les variables et fonctions globales sont mauvaises, alors pourquoi ne pas mettre les vôtres dans l'espace de noms jQuery:

$.extend({
  myFunc : function(someArg, callbackFnk){
    var url = "http://example.com?q=" + someArg;
    $.getJSON(url, function(data){

      // now we are calling our own callback function
      if(typeof callbackFnk == 'function'){
        callbackFnk.call(this, data);
      }

    });
  }
});

$.myFunc(args, function(){
  // now my function is not hardcoded
  // in the plugin itself
});

Lisez cet article pour mieux comprendre: Création de fonctions de rappel dans jQuery

22
Uzbekjon

Si je vous comprends bien, c'est aussi simple que de définir un autre paramètre et d'appeler la variable en tant que fonction:

function foo(mycallback) {
    mycallback();
}
14
Alan Plum

Pourquoi n'utilisez-vous pas un objet que vous pouvez transmettre à la fonction. Il ressemble beaucoup plus à jQuery et vous évite d'avoir x paramètres nommés, ce qui est difficile à maintenir car il peut devenir difficile à manier lorsque vous passez les 3 derniers paramètres.

par exemple

function callingFunction(){

      var fnSettings: {
        url: someUrl,
        data: params,
        callback : function(){}
      };


      yourFunction( fnSettings );

}

function yourFunction( settings ) {

      $.post( settings.url, settings.data, settings.callback );

}
11
redsquare