2010-10-31 7 views
0

Je travaille avec jQuery. J'ai une application qui fait des requêtes ajax au serveur qui répond avec JSON.JS: Utilisation des noms de variables pour appeler la fonction

dans certains cas, la réponse du serveur indique le nom d'une fonction JS à appeler

{"responseType":"callback", "callback":"STUFF.TestCallback","callbackData":"this is in the callback"} 

Si le responseType est « rappel », comme au-dessus du JSON est passé à une fonction pour gérer cette réponse type. (Le var « réponse » contient le JSON ci-dessus)

STUFF.callback = function(response){ 
    if(typeof response.callback =='function'){ 
     console.log("All Good") 
     response.callback(response); 
    }else{ 
     console.log("Hmm... Cant find function",response.callback); 
    } 
} 


STUFF.TestCallBack = function(data){ 
    alert("it worked"); 
} 

Mais quand je fais cela je reçois l'erreur « response.callback n'est pas une fonction ».

Les commentaires sur les raisons pour lesquelles cela ne fonctionne pas et comment le faire correctement seraient grandement appréciés.

Répondre

3

Une chaîne est une chaîne et non une fonction.

response.callback() ne fonctionne pas parce qu'il est le même que "STUFF.TestCallback"() ne STUFF.TestCallback()

Vous voulez sans doute avoir les données structurées quelque chose plus comme "callback": "TestCallback" puis ensuite faire:

STUFF[response.callback](response); 

Ici, vous utilisez la chaîne pour accéder à une propriété de STUFF. (foo.bar et foo['bar'] équivalents.)

+0

Merci David! Fait parfaitement sens dans la vision arrière! – Alex

0

Vous pouvez faire propably

var myfunction = eval(response.callback); 
myfunction(response); 

bien que l'utilisation eval() est considéré comme un mauvais style par certains développeurs javascript.

+0

Mauvais style. Difficile à maintenir. Difficile à déboguer. Lent et inefficace. Bonne source de problèmes de sécurité. – Quentin

1

Vous pouvez transformer ce « namespace.func » dans un appel comme celui-ci:

STUFF.callback = function(response) { 
    var fn = response.callback.split("."), func = window; 
    while(func && fn.length) { func = func[fn.shift()]; } 
    if(typeof func == 'function') { 
    console.log("All Good") 
    func(response); 
    } else{ 
    console.log("Hmm... Cant find function", response.callback); 
    } 
} 

Qu'est-ce qu'il ne saisit la fonction en obtenant window["STUFF"] alors window["STUFF"]["TestCallback"] comme boucles, vérifier si chaque niveau est défini comme va prévenir les erreurs. Notez que cela fonctionne aussi pour n'importe quelle fonction de niveau, par exemple "STUFF.One.Two.func" fonctionnera aussi bien.

Questions connexes