2010-12-08 7 views
0

J'ai un appel Ajax avec un rappel. (J'utilise YUI pour ça). L'appel de base ressemble à ceci:rappels de déclenchement ronds

function something() { 
    var callback1_success = function (o) {… 
    }; 
    var callback1_failure = function (o) {… 
    }; 
    var callback1 = { 
    success: callback1_success, 
    failure: callback1_failure 
    }; 
    var callback2_success = function (o) {… 
    }; 
    var callback2_failure = function (o) {… 
    }; 
    var callback2 = { 
    success: callback2_success, 
    failure: callback2_failure 
    }; 
    var ajax_params = buildAjaxParams(….); 
    Y_GET(ajax_params, callback1); 
    var ajax_params = buildAjaxParams(….); // different stuff 
    Y_GET(ajax_params, callback2); 
} // something 

function Y_GET(p_parms, p_callback) { 
    request = YAHOO.util.Connect.asyncRequest('GET', p_parms, p_callback); 
    return (request); 
} // Y_GET 
This all works fine.What I want to do is send the callback to the server, the server will not process the callback parameters and will send them back in the result set. 

So, Y_GET will become: Function Y_GET(p_parms, p_callback) { 
    var parms_to_send = p_parms + “ & passthrough = ” + p_callback; 
    request = YAHOO.util.Connect.asyncRequest('GET', parms_to_send, local_callback); 
    return (request); 
} // Y_GET 
var local_callback = { 
    success: function (o) { 
    o.responseText.passthrough.success 
    }, 
    failure: function (o) { 
    o.responseText.passthrough.failure 
    } 
}; /* paste in your code and press Beautify button */ 
if ('this_is' == /an_example/) { 
    do_something(); 
} else { 
    var a = b ? (c % d) : e[f]; 
} 

Alors, comment transmettre une fonction de rappel au serveur; qui renvoie le nom et l'appelle. S'il y a une autre approche, je suis ouvert à cela, de passer une fonction de rappel et d'agir sur elle dans l'ensemble de réponses.

Merci.

+0

utilisez les boutons de format la prochaine fois. – galambalazs

Répondre

0

Au sommet de ma tête, il y a quelques approches auxquelles je peux penser. eval() est une possibilité, mais est généralement considéré comme quelque chose à éviter étant donné le risque d'exécuter du code JS arbitraire (en fin de compte cela dépend de qui fournit la chaîne qui est en cours d'évaluation).

je recommande l'approche suivante:

vous créer des fonctions comme les déclarations sur un objet JS base. Ensuite, utilisez la chaîne renvoyée par votre appel AJAX en tant qu'indexeur de propriété dans votre objet Callbacks. Je ne connais pas les demandes AJAX YUI, mais nous espérons que vous avez l'idée:

var p_callback = function(){ 
    var local_callback = // parse response, get the callback method you want by name/string 
    Callbacks[local_callback](); // providing arguments as needed, of course 
}; 
YAHOO.util.Connect.asyncRequest('GET', p_parms, p_callback); 

En utilisant des accesseurs de propriété sur votre objet, vous êtes assuré que vous exécutez seulement votre propre code de rappel, au lieu de JavaScript arbitraire qui peut ont été inclus dans la réponse.