2009-06-23 18 views
48

Tengo la siguiente función.Cómo escribo una función jquery que acepta una devolución de llamada como un parámetro

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); 

     }); 

    }); 

}; 

Pero yo quiero ser capaz de llamarlo como esto

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

¿Cómo puedo implementar el soporte para las devoluciones de llamada en mi función?

Respuesta

75
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'); 
    } 
); 
}; 

Puede pasar funciones como cualquier otro objeto en JavaScript. Pasar en una función de devolución de llamada es sencillo, incluso puede hacerlo usted mismo en la llamada $.post().

Puede decidir si desea llamar su devolución de llamada como parte de la devolución de llamada $.post() o solo.

+0

exactamente lo que he intentado hacer durante los últimos 30 minutos. ¡Gracias! me ayudó –

+0

Gracias por la parte "if (typeof f ==" function ") f();". ¡He estado buscando eso! – Garavani

14

Si he entendido bien, es tan fácil como configurar otro parámetro y llamar a la variable como una función:

function foo(mycallback) { 
    mycallback(); 
} 
11

¿Por qué no se utiliza un objeto que se puede pasar a través de la función. Es mucho más como jQuery y te ahorra tener x parámetros nombrados que es difícil de mantener, ya que puede ser difícil de manejar cuando pasas 3 parámetros.

por ejemplo

function callingFunction(){ 

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


     yourFunction(fnSettings); 

} 

function yourFunction(settings) { 

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

} 
+0

Esta es definitivamente la respuesta más limpia (escribí algo similar, por lo que podría ser parcial) – arviman

22

Usted sabe que las variables y funciones globales son malas, ¿por qué no poner los de en el espacio de nombres de 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 
}); 

Leer este post para obtener una mejor comprensión: Creating callback functions in jQuery

+0

Cool. ¿Cómo puedo crear una función anónima como en Jquery sí mismo '$ .hide (555, function()) {})' ?? O callbackFnk es la respuesta? – aleXela

+0

Yeap, 'callbackFnk' es solo una variable local. Como puede ver en el ejemplo, estamos pasando una función anónima: '$ .myFunc (args, function() {})'. – Uzbekjon

+0

¡Gracias una vez más! Una pregunta más, ¿se disparará después del final del func principal? – aleXela

Cuestiones relacionadas