你如何处理javascript对象中的asp.net服务器回调?

时间:2009-05-17 01:17:41

标签: asp.net javascript web-services oop

我在使用javascript中对象中的webmethods使用服务器回调时出现问题...

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 个答案:

答案 0 :(得分:2)

这不是网络服务问题。这是标准的JavaScript功能。在回调函数中,对“this”的引用成为对全局范围“窗口”对象的引用。以下是解决这个问题的方法:

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 :(得分:1)

你必须以某种方式在调用时绑定'this'对象的范围,以便稍后在同一范围内执行回调。目前,您的回调函数在全局窗口范围内以编码方式执行,因此'this'== Window。如果您使用的是框架,它们通常会提供一些方法来将范围作为回调的一部分来简化。

您还可以围绕回调参数创建一个闭包,如下所述:JavaScript Callback Scope