2010-09-07 2 views
0

Je suis désolé pour le titre ambigu, mais cette question est difficile pour moi de mettre en mots, je peux seulement sembler le décrire avec du code.Comment sous-classer l'objet ajax jQuery ou réutiliser un rappel commun?

J'ai la fonction suivante

function initRPC(procedureName, parameters) 
{ 
    var parcel = //some code that parcels up the procedure name and params 

    $.get(
     'url'  : 'rpcserver.php', 
     'data' : parcel, 
     'success' : function(returnXML) { 
      unparcel = //some code to unwrap the returned data 

      /** 
      * now instance specific code 
      */ 
     } 
    ); 
} 

Lorsqu'il dit now instance specific code est où je veux code spécifique, et de réutiliser le reste comme initRPC sera appelé fréquemment.

Par exemple, je voudrais lancer la initRPC comme ceci:

function getUsername() 
{ 
    alert('Your name is: ' + initRPC('getUsername', { id: someVar })); 
} 

ou comme celui-ci (dans cet exemple, la signature de la commande initRPC étendrait à inclure la référence de fonction passée, mais je n » t savoir comment transmettre cette référence au rappel .post $:

function getUsername() 
{ 
    initRPC('getUsername', {id: someVar}, function todoAfterUnWrap(data) { 
     alert('Your name is: ' + data); 
    }); 
} 

Je ne vois pas une façon de faire ce que je l'espérais, on dirait que je vais devoir toujours répéter l'appel .ajax $() avec déballer et encapsuler dans chaque fonction (comme getUsername()).

Rephrased: comment j'encapsule le code de préparation de données, la requête AJAX et le code de déballage ensemble, puis autorise par exemple l'exécution d'un code spécifique après ceux-ci. Asynchronously.

[modifier] L'idée de venir me est maintenant la façon typique de réutilisation du code dans cette situation est la suivante:

function getUsername() 
{ 
    var request = prepareRequest('getUsername', { id: someVar }); 

    $.get(
     'url'  : 'rpcserver.php', 
     'data' : request 
     'success' : function(response) { 
      response = decodeResponse(response); 
      /* instance specific code */ 
     } 
    ); 
} 

Peut-être est la seule façon, il me semble juste d'exiger de répéter beaucoup du même code dans chaque fonction comme getUsername()

Répondre

1

Si l'idée est d'afficher une fonction de rappel, c'est assez facile. Vous pouvez garder votre code comme il est prévu dans cet exemple:

function getUsername() 
{ 
    initRPC('getUsername', {id: someVar}, function todoAfterUnWrap(data) { 
     alert('Your name is: ' + data); 
    }); 
} 

Et écrire initRPC comme ceci:

function initRPC(procedureName, parameters, callbackFn) 
{ 
    var parcel = //some code that parcels up the procedure name and params 

    $.get(
     'url'  : 'rpcserver.php', 
     'data' : parcel, 
     'success' : function(returnXML) { 
      unparcel = //some code to unwrap the returned data 
      callbackFn(unparcel); 
    }); 
} 
Questions connexes