2010-10-28 30 views
0

J'ai une fonction lente qui fait une requête AJAX:Javascript: appeler une fonction spécifique sur la fonction complète

function X(param1,param2){ 
var params={ 
    type: "POST", 
    url: "./ajax/useful.php", 
    data: "param1="+param1+"&param2="+param2, 
    success: function(msg){ 
     //do something 
    } 
    }; 
    var result=$.ajax(params).responseText; 
} 

Tout fonctionne bien quand je l'appelle X (« asdf », « qwerty »).

Maintenant, ce que je veux faire est d'être en mesure d'appeler la fonction X comme suit:

function X(param1,param2,function(){alert('hi');}){ 
var params={ 
    type: "POST", 
    url: "./ajax/useful.php", 
    data: "param1="+param1+"&param2="+param2, 
    success: function(msg){ 
     ///// 
     //I want to be able call the function in the 3rd parameter (alert in this case) 
     ///// 
    } 
    }; 
    var result=$.ajax(params).responseText; 
} 

Maintenant, vous pourriez dire pourquoi ne pas simplement appeler alert (« salut ») directement à l'intérieur du succès . Bien sûr que je peux le faire, mais je veux pouvoir varier ce qui se passe à l'intérieur de la fonction appelée (pas seulement une simple alerte ('hi'), selon qui appelle X.

Répondre

4

Vous déclarez votre fonction X comme ça :

function X(param1,param2,callback){ 

... utiliser la fonction de rappel comme ceci:

success: function(msg){ 
    callback(); 
} 

... et appellent X comme ceci:

X('a', 'b', function(){alert('hi');}); 

Cela fonctionne parce que votre gestionnaire de succès est une fermeture sur les données au sein de votre fonction X, y compris ses arguments. Il a une référence en direct à cette information (même après X renvoie), et donc plus tard lorsque l'appel Ajax se termine, il peut toujours utiliser l'argument callback. Plus sur les fermetures ici: Closures are not complicated

+0

Légende, cela devrait fonctionner. Je n'étais pas sûr de la syntaxe. Merci beaucoup, – Eamorr

0
function X(param1,param2,f){ 
var params={ 
    type: "POST", 
    url: "./ajax/useful.php", 
    data: "param1="+param1+"&param2="+param2, 
    success: function(msg){ 
     f(); 
    } 
    }; 
    var result=$.ajax(params).responseText; 
} 

devrait fonctionner. Vous ne pouvez pas appeler X comme ceci:

X(param1,param2,function(){dowhatever}) 
+0

Salut, merci pour la réponse. T.J. Crowder, ci-dessus, a trouvé un bon moyen d'appeler X tout en profitant pleinement des fonctions anonymes. – Eamorr

+0

@Eamorr mon code est exactement le même que la seule différence est que 'callback' est appelé 'f' dans mon code :) – joni