2009-05-17 15 views
1

私は新しいmyObjectというが作成されたときに、それは名前を見つけ、名前を持っていたら、その後のsayHelloを呼び出します...JavaScriptオブジェクト内のasp.netサーバーコールバックをどう対処しますか?

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(); 
} 

をJavaScriptでオブジェクト内のwebMethodsにサーバーのコールバックを使用して、問題を抱えています発見されました。

サービスルーチンが機能し、正しい名前が返されます。

問題は、サーバーから名前が返され、this.sayHelloが呼び出された後も、同じオブジェクト内にあるようには見えません(同じmyObjectを参照していない名前はthis.helloがnullを返すので...

アイデア?

答えて

2

これは、Webサービスの問題ではありません。それは標準的な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

コールバックが後で同じスコープ内で実行されるように、呼び出し時に 'this'オブジェクトのスコープを何とかバインドする必要があります。現在、コールバック関数はコード化されたグローバルウィンドウスコープで実行されるため、 'this' == Window。フレームワークを使用している場合は、通常、コールバックの一部としてスコープを渡す何らかの方法が用意されています。ここで説明したように

はまた、コールバックパラメータの周りにクロージャを作成することができます。JavaScript Callback Scope

関連する問題