2012-10-22 20 views
13

Questa domanda sembra un duplicato, poiché il titolo è quasi replicato. Ma il mio problema sembra più semplice e non riesco a trovare la risposta.Funzione di callback Javascript con parametri

Ho una funzione JavaScript che esegue un'altra funzione di callback, funziona in questo modo:

<script type='text/javascript'> 
firstfunction(callbackfunction); 
</script> 

in cui la funzione di callback è definita come:

callbackfunction(response) { 
    if (response=='loggedin'){ 
    // ... do stuff 
}} 

ma voglio che sia qualcosa di simile :

callbackfunction(response, param) { 
    if (response=='loggedin'){ 
    // ... do stuff with param 
}} 

La mia domanda è, funziona per passare il parametro in questo modo:

<script type='text/javascript'> 
firstfunction(callbackfunction(param)); 
</script> 

o sto sbagliando?

risposta

24

In risposta diretta alla sua domanda, questo non funziona:

firstfunction(callbackfunction(param)); 

Che eseguirà immediatamente callbackfunction e passerà il valore di ritorno dall'esecuzione come argomento a firstfunction che è improbabile quello che vuoi.


Non è chiaro dalla tua domanda se si deve solo cambiare firstfunction() a passare due parametri per callbackfunction() quando chiama la richiamata o se si dovrebbe fare una funzione anonima che chiama la funzione di callback con argomenti.

Queste due opzioni sarebbero simile a questa:

function firstfunction(callback) { 
    // code here 
    callback(arg1, arg2); 
} 

firstfunction(callbackfunction); 

o

function firstfunction(callback) { 
    // code here 
    callback(); 
} 

firstfunction(function() { 
    callbackfunction(xxx, yyy); 
}); 
+0

Grazie per rispondere direttamente alla domanda! Sono abbastanza sicuro che riuscirò a far funzionare uno di questi metodi. – rofls

1

function è una parola chiave, non è possibile utilizzarlo come nome funzione.

diciamo il nome di funzione è foo, allora si potrebbe fare come di seguito:

var param = 'what ever'; 
foo(function(response) { 
    callbackfunction(response, param); 
}); 
7

Usa una funzione anonima:

function foo(callback) { 
    callback(); 
} 

function baz(param) { 
    console.log(param); 
} 

foo(function(){ baz('param') }); 
2

Aggiunta di parametri quando si chiama una funzione. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

xdaz ha già risposto alla versione semplice. Ecco un esempio con quantità variabile di parametri.

function someObject(){ 
     this.callbacks=new Array(); 
     this.addCallback=function(cb){ 
      this.callbacks[this.callbacks.length]=cb 
     } 
     this.callCallbacks=function(){ 
      //var arr=arguments; this does not seem to work 
      //arr[arr.length]="param2"; 
      var arr = new Array(); 
      for(i in arguments){ 
       arr[i]=arguments[i]; 
      } 
      arr[arr.length]="another param"; 
      i=0; 
      for(i in this.callbacks){ 
       this.callbacks[i].apply(null,arr); 
       //this.callbacks[i].apply(this,arr); 
       //this is a ref to currrent object 
      } 
     } 
     this.callCallbacksSimple=function(arg){ 
      for(i in this.callbacks){ 
       this.callbacks[i](arg,"simple parameter"); 
      } 

     } 
} 
function callbackFunction(){ 
    for(i in arguments){ 
     console.log("Received argument: " + arguments[i]); 
    } 
} 
var ObjectInstance=new someObject(); 
ObjectInstance.addCallback(callbackFunction); 
ObjectInstance.callCallbacks("call callbacks"); 
ObjectInstance.callCallbacksSimple("call callbacks"); 
1

Penso che questo sia quello che stai cercando.

Diciamo che stai usando jQuery ajax per fare qualcosa, e lo stai passando chiamato callbacks. Qui abbiamo un callback onError che potresti usare per registrare o gestire errori nella tua applicazione.È conforme alla jQuery Ajax identificativo di errore di callback, tranne che per un parametro in più che si potrebbe avere voluto aggiungere sul retro

function onError(jqXHR, textStatus, errorThrown, yourOwnVariableThing) { 
    console.error('Something went wrong with ' + yourOwnVariableThing); 
} 

è qui che la funzione sarebbe stata chiamata - ma si vuole un parametro aggiuntivo

$.ajax("/api/getSomeData/") 
.done(onDone) 
.fail(onError) 
.always(onComplete); 

Quindi questo è ciò che si può fare per aggiungere il parametro aggiuntivo

$.ajax("/api/getSomeData/") 
    .done(onDone) 
    .fail(onError.bind(this, arguments[0], arguments[1], arguments[2], 'Moo Moo'); 
    .always(onComplete); 

arguments è un array in JavaScript che contiene tutti argume nts è passato a una funzione e quindi stai solo passando quegli argomenti al callback.

Arguments

Bind

Problemi correlati