2012-11-10 4 views
2

J'utilise une fonction $ .ajax qui sert à deux fins et selon le contexte, je veux exécuter différentes fonctions sur le rappel.en passant le nom de la fonction à exécuter en tant que paramètre

function MyAjaxCall(SomeParameter, CallBackFunctionName) { 

    $.ajax({ 
    ... 
    success: function (msg) { 

    var TheData = msg.hasOwnProperty("d") ? msg['d'] : msg; 
    // here: "execute the function in parameter CallBackFunctionName 
    // AND pass it the parameter TheData 
    } 
} 

Comment puis-je écrire la ligne où le nom de la fonction est un paramètre et je veux transmettre theData comme paramètre.

Note, en ce moment, j'écris comme ça:

if (CallBackFunctionName === "SomeFunctionName1") { 
    SomeFunctionName1(TheData); 
} else { 
    SomeFunctionName2(TheData); 
} 
+0

est cette fonction une fonction globale? pourquoi ne pas simplement passer la fonction réelle dans la méthode MyAjaxCall? – sdepold

Répondre

4

Si la fonction est définie comme une fonction globale puis utilisez:

window[functionName](arguments); 

Si elle ne puis changer la façon dont MyAjaxCall est appelé comme si :

MyAjaxCall.apply(thisArg, [SomeParameter, CallBackFunction]); //thisArg is the value of the this object inside MyAjaxCall(). 

alors à l'intérieur MyAjaxCall() faire:

function MyAjaxXall(SomeParam, CallBackFunction){ 
    var me = this; //the object supplied through thisArg while calling. 
    $.ajax({ 
    success : function(msg) 
    { 
     //whatever processing you want 
     me[CallBackFunction](arguments); 
    } 

    }); 
} 

Ou vous pouvez ajouter l'objet dans le cadre des paramters de MyAjaxCall():

function MyAjaxCall(SomeParam, obj, CallBackFunction) 
{ 

     $.ajax({ 
     success : function(msg) 
     { 
      //whatever processing you want 
      obj[CallBackFunction](arguments); 
     } 

     }); 
} 

Lorsque vous utilisez pour appeler une utilisation globale de la fonction:

MyAjaxCall(SomeParam, window, CallBackFunction); 
+0

ok, merci pour la réponse. Upvoted à cause du concept mais je garde ma mise en place car c'est plus simple. Merci encore. – frenchie

2

En supposant que est globale, la fonction définie dont le nom est passé par la callbackFunctionName variable que vous pouvez faire:

window[CallBackFunctionName](TheData) 

Vous pouvez également passer juste la fonction réelle à MyAjaxCall comme ceci:

var MyCallbackFunction = function(data){ console.log(data) } 
MyAjaxCall({param1: 'value1'}, MyCallbackFunction) 

De cette façon, vous pouvez simplement exécuter la fonction:

function MyAjaxCall(SomeParameter, CallBackFunction) { 

    $.ajax({ 
    ... 
    success: function (msg) { 

    var TheData = msg.hasOwnProperty("d") ? msg['d'] : msg; 
    CallBackFunction(TheData) 
    } 
} 
+0

En fait, tout est dans une fermeture et aucune de ces fonctions n'est accessible depuis la portée globale. – frenchie

+0

ok, merci pour la réponse. Upvoted à cause du concept mais je garde ma mise en place car c'est plus simple. Merci encore. – frenchie

Questions connexes