2010-01-04 14 views
13

Voglio qualcosa di simile a questo.javascript funzione e parametri di callback

function AjaxService() 
{ 

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

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

quindi il mio programma chiamante sarà così

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

function success(res) 
{ 


} 

Anche se voglio aggiungere più parametri alla funzione di successo come farò achive esso. Dire Se ho verrà appretiated funzione di successo come questo

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

function success(res,val1, val2) 
{ 


} 

Guida.

saluti Parminder

risposta

22

Utilizzare una chiusura e una fabbrica di funzione:

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

Cosa stai passando qui non è il Funzione generateSuccess ma la funzione anonima restituita da generateSuccess sembra la richiamata prevista da Remove. val1 e val2 vengono passati in generateSuccess e catturati da una chiusura nella funzione anonima restituita.

Per essere più chiari, questo è quello che sta succedendo:

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

O se si preferisce farlo in linea:

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

non più leggibili, ma si evita di nominare la funzione di fabbrica. Se non stai facendo questo in un ciclo allora la soluzione di Xinus sarebbe anche bene e più semplice della mia versione inline. Ma sappi che in un ciclo è necessario il meccanismo di doppia chiusura per disconnettere la variabile passata nella funzione di callback dalla variabile nell'ambito corrente.

+2

ci sono modi meno complicati per fare questo in javascript, non credi ? – jrharshath

+0

non ha funzionato grazie comunque – Parminder

+0

@parminder Sei sicuro che non funzioni? Questo è il modo standard per passare argomenti a callback che non accettano argomenti, per esempio passare argomenti a 'setTimeout'. C'è qualcosa che potresti aver perso forma la sintassi? – slebetman

8

È possibile passare puntatore a funzione come anonimo

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

dovrebbe essere: 'xx.Remove (1, la funzione (res) {successo (res, val1, val2)});' – slebetman

0

un modo per farlo:

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

in modo da poter usare in questo modo:

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

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

Io di solito hanno la richiamata eseguire utilizzando un setTimeout. In questo modo, la richiamata verrà eseguita quando avrà il tempo di farlo. Nel frattempo, il codice continuerà ad essere eseguito, ad esempio

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

La richiamata verrà eseguita dopo l'avviso # 2.

Ovviamente, nel caso della vostra applicazione, avverrà automaticamente poiché il callback ajax stesso è asincrono. Quindi nella tua applicazione, è meglio non farlo.

Cheers!
JRH

+0

in CallBack riferimento alla funzione call_back non esiste come verrà chiamato. – Parminder

+1

JS tende a non usare pattern come questo; generalmente qualsiasi altro stato è avvolto in una chiusura. –

Problemi correlati