2009-05-17 3 views
1

Je vais avoir un problème avec l'utilisation callbacks du serveur à webMethods dans un objet en javascript ...Comment gérez-vous les rappels de serveur asp.net dans les objets javascript?

function myObject() { 
    this.hello = "hello"; 
    var id = 1; 
    var name; 

    this.findName = function() { 
      alert(this.hello); //Displays "hello" 
      myServices.getName(id, this.sayHello); 
    } 

    this.sayHello = function(name) { 
      alert(this.hello); //Displays null <-- This is where I'm confused... 
      alert(name); //Displays the name retrieved from the server 
    } 

    this.findName(); 
} 

Alors, quand un nouveau myObject est créé, il trouve le nom, puis appelle sayHello fois le nom été trouvé.

La routine de service fonctionne et renvoie le nom correct. Le problème est qu'après le retour du nom du serveur et l'appel de this.sayHello, il ne semble pas être dans le même objet (pas de référence au même myObject que nous étions quand nous avons trouvé le name) car this.hello donne une valeur nulle ...

Des idées?

Répondre

2

Ce n'est pas un problème de webservice. C'est une fonctionnalité javascript standard. Dans une fonction de rappel, la référence à "this" devient une référence à l'objet "window" globalement défini. Voici comment vous pouvez résoudre cela:

function myObject() { 
    this.hello = "hello"; 
    var id = 1; 
    var name; 
    var self = this; //reference to myObject 
    this.findName = function() { 
      alert(this.hello); /* Displays "hello" */ 
      myServices.getName(id, this.sayHello); 
    } 

    this.sayHello = function(name) { 
      alert(self.hello); /* Displays "hello" instead of "undefined" */ 
      alert(name); /* Displays the name retrieved from the server */ 
    } 

    this.findName(); 
} 
1

Vous devez en quelque sorte lier la portée de l'objet 'this' au moment de l'appel afin que le rappel s'exécute dans la même portée plus tard. Actuellement, votre fonction de rappel s'exécute dans l'étendue de la fenêtre globale comme étant codée, donc 'this' == Window. Si vous utilisez un framework, ils fournissent généralement un moyen de passer la portée dans le cadre du callback pour faciliter cela.

Vous pouvez également créer une fermeture autour du paramètre de rappel, comme expliqué ici: JavaScript Callback Scope

Questions connexes