2010-01-04 5 views
13

Je veux quelque chose de similaire à cela.fonction de rappel javascript et les paramètres

function AjaxService() 
{ 

this.Remove = function (id, call_back) 
{ 
    myWebService.Remove(id, CallBack) 
} 

function CallBack(res) { 
     call_back(res); 
    } 
} 

donc mon programme d'appel sera comme celui-ci

var xx = new AjaxService(); 
xx.Remove(1,success); 

function success(res) 
{ 


} 

Aussi, si je veux ajouter d'autres paramètres à la fonction de succès comment vais-je achive il. Say Si j'ai fonction de succès comme celui-ci

var xx = new AjaxService(); 
//how to call back success function with these parameters 
//xx.Remove(1,success(22,33)); 

function success(res,val1, val2) 
{ 


} 

aide sera appretiated.

Cordialement Parminder

Répondre

22

Utilisez une fermeture et une usine de fonction:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
xx.Remove(1,generateSuccess(val1,val2)); 

Qu'est-ce que vous passez est pas là la generateSuccess fonction mais la fonction anonyme retournée par generateSuccess qui ressemble à la fonction de rappel attendue par Remove. val1 et val2 sont passés dans generateSuccess et capturés par une fermeture dans la fonction anonyme retournée.

Pour être plus clair, voici ce qui se passe:

function generateSuccess (var1,var2) { 
    return function (res) { 
     // use res, var1 and var2 in here 
    } 
} 
var success = generateSuccess(val1,val2); 
xx.Remove(1,success); 

Ou si vous préférez le faire en ligne:

xx.Remove(1,(function(var1,var2) { 
    return function (res) { 
     // this is your success function 
    } 
})(val1,val2)); 

pas lisible mais vous évite de nommer la fonction d'usine. Si vous ne faites pas cela en boucle, alors la solution de Xinus serait aussi bien et plus simple que ma version en ligne. Mais sachez que dans une boucle, vous avez besoin du mécanisme de double fermeture pour déconnecter la variable passée dans la fonction de rappel de la variable dans la portée actuelle.

+2

il existe des moyens moins compliqués pour le faire en javascript, vous ne pensez pas ? – jrharshath

+0

didnt travail merci de toute façon – Parminder

+0

@parminder Êtes-vous sûr que cela ne fonctionne pas? C'est la manière standard de passer des arguments aux callbacks qui n'acceptent pas les arguments, par exemple en passant des arguments à 'setTimeout'. Y a-t-il quelque chose que vous avez manqué de la syntaxe? – slebetman

8

Vous pouvez passer comme pointeur de fonction anonyme

xx.Remove(1,function(){ 
          //function call will go here 
          success(res,val1, val2); 
         }); 
+7

devrait être: 'xx.Remove (1, fonction (res) {succès (res, val1, val2)});' – slebetman

0

une façon de le faire:

function AjaxService { 
    var args_to_cb = []; 
    this.Remove = function (id, call_back, args_to_callback_as_array) { 
     if(args_to_callback_as_array!=undefined) 
      args_to_cb = args_to_callback_as_array; 
     else 
      args_to_cb = []; 
     myWebService.Remove(id, CallBack) 
    } 

    function CallBack(res) { 
     setTimeout(function(){ call_back(res, args_to_cb); }, 0); 
    } 
} 

vous pouvez donc l'utiliser comme ceci:

var service = new AjaxService(); 
service.Remove(1,success, [22,33]); 

function success(res,val1, val2) 
{ 
    alert("result = "+res); 
    alert("values are "+val1+" and "+val2); 
} 

J'ai généralement le rappel exécuter à l'aide d'un setTimeout. De cette façon, votre callback s'exécutera quand il aura le temps de le faire. Votre code continuera à être exécuté pendant ce temps, par exemple:

var service = new AjaxService(); 
service.remove(1, function(){ alert('done'); }); // alert#1 
alert('called service.remove'); // alert#2 

Votre rappel s'exécutera après l'alerte # 2.

Bien sûr, dans le cas de votre application, cela se produira automatiquement puisque le rappel ajax lui-même est asynchrone. Donc, dans votre application, vous feriez mieux de ne pas le faire.

À la votre!
HJR

+0

dans la référence de la fonction CallBack à call_back n'existe pas comment il sera appelé. – Parminder

+1

JS a tendance à ne pas utiliser de motifs comme celui-ci; généralement tout autre état est enveloppé dans une fermeture. –

Questions connexes