2010-01-04 23 views
13

Quiero algo similar a esto.función y parámetros de devolución de llamada javascript

function AjaxService() 
{ 

this.Remove = function (id, call_back) 
{ 
    myWebService.Remove(id, CallBack) 
} 

function CallBack(res) { 
     call_back(res); 
    } 
} 

por lo que mi programa de llamada será así

var xx = new AjaxService(); 
xx.Remove(1,success); 

function success(res) 
{ 


} 

Además, si quiero añadir más parámetros a la función del éxito ¿cómo voy a achive ella. decir si tengo éxito la función como esta

var xx = new AjaxService(); 
//how to call back success function with these parameters 
//xx.Remove(1,success(22,33)); 

function success(res,val1, val2) 
{ 


} 

ayuda será appretiated.

Saludos Parminder

Respuesta

22

Uso de un cierre y una fábrica de función:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
xx.Remove(1,generateSuccess(val1,val2)); 

Lo que está pasando aquí no es el generateSuccess función pero la función anónima devuelta por generateSuccess que se parece a la devolución de llamada esperada por Remove. val1 y val2 pasan a generateSuccess y son capturados por un cierre en la función anónima devuelta.

Para ser más claro, esto es lo que está pasando:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
var success = generateSuccess(val1,val2); 
xx.Remove(1,success); 

O si lo prefiere hacerlo en línea:

xx.Remove(1,(function(var1,var2) { 
    return function (res) { 
     // this is your success function 
    } 
})(val1,val2)); 

no tan legible, pero le salva de nombrar la función de fábrica. Si no estás haciendo esto en un bucle, entonces la solución de Xinus también sería mejor y más simple que mi versión en línea. Pero tenga en cuenta que en un bucle necesita el mecanismo de cierre doble para desconectar la variable pasada a la función de devolución de llamada de la variable en el alcance actual.

+2

hay formas menos complicadas de hacer esto en javascript, ¿no les parece ? – jrharshath

+0

no funcionó gracias de todos modos – Parminder

+0

@parminder ¿Estás seguro de que no funciona? Esta es la forma estándar de pasar argumentos a devoluciones de llamada que no aceptan argumentos, por ejemplo, pasar argumentos a 'setTimeout'. ¿Hay algo que se haya perdido de la sintaxis? – slebetman

8

Usted puede pasarlo como puntero de función anónima

xx.Remove(1,function(){ 
          //function call will go here 
          success(res,val1, val2); 
         }); 
+7

debe ser: 'xx.Remove (1, función (res) {éxito (res, val1, val2)});' – slebetman

0

una manera de hacer esto:

function AjaxService { 
    var args_to_cb = []; 
    this.Remove = function (id, call_back, args_to_callback_as_array) { 
     if(args_to_callback_as_array!=undefined) 
      args_to_cb = args_to_callback_as_array; 
     else 
      args_to_cb = []; 
     myWebService.Remove(id, CallBack) 
    } 

    function CallBack(res) { 
     setTimeout(function(){ call_back(res, args_to_cb); }, 0); 
    } 
} 

Así se puede utilizar de esta manera:

var service = new AjaxService(); 
service.Remove(1,success, [22,33]); 

function success(res,val1, val2) 
{ 
    alert("result = "+res); 
    alert("values are "+val1+" and "+val2); 
} 

que por lo general tienen la devolución de llamada ejecuta utilizando un setTimeout. De esta forma, su devolución de llamada se ejecutará cuando tenga tiempo para hacerlo. Su código continuará ejecutándose mientras tanto, por ejemplo:

var service = new AjaxService(); 
service.remove(1, function(){ alert('done'); }); // alert#1 
alert('called service.remove'); // alert#2 

Su devolución de llamada se ejecutará después de la alerta # 2.

Por supuesto, en el caso de su aplicación, sucederá de forma automática ya que la devolución de llamada ajax es asincrónica. Entonces, en su aplicación, será mejor que no haga esto.

¡Salud!
JRH

+0

en la referencia de la función CallBack para call_back no existe cómo se llamará. – Parminder

+1

JS tiende a no utilizar patrones como este; generalmente cualquier otro estado está envuelto en un cierre. –

Cuestiones relacionadas