Как вы справляетесь с обратными вызовами сервера asp.net в объектах javascript? - PullRequest
1 голос
/ 17 мая 2009

У меня проблема с использованием обратных вызовов сервера для веб-методов внутри объекта в 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();
}

Таким образом, когда создается новый myObject, он находит имя и затем вызывает sayHello, как только имя найдено.

Сервисная программа работает и возвращает правильное имя.

Проблема в том, что после того, как имя возвращается с сервера и вызывается this.sayHello, оно, похоже, не находится в том же объекте (нет ссылки на тот же myObject, в котором мы находились, когда находили имя ) потому что this.hello дает ноль ...

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 17 мая 2009

Это не проблема веб-сервиса. Это стандартная функциональность javascript. В функции обратного вызова ссылка на this становится ссылкой на глобально ограниченный объект window. Вот как вы можете решить это:

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 голос
/ 17 мая 2009

Вы должны каким-то образом связать область действия объекта this во время вызова, чтобы обратный вызов выполнялся в той же области позже. В настоящее время ваша функция обратного вызова выполняется в области видимости глобального окна как закодированная, поэтому 'this' == Window. Если вы используете фреймворк, они обычно предоставляют способ передачи контекста как часть обратного вызова, чтобы сделать это проще.

Вы также можете создать замыкание вокруг параметра обратного вызова, как описано здесь: Область обратного вызова JavaScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...